Php 如何优化此导入/导出数据查询,从2个表到1个记录超过200k的表

Php 如何优化此导入/导出数据查询,从2个表到1个记录超过200k的表,php,mysql,pdo,Php,Mysql,Pdo,第三个表将填充第一个表和第二个表中的数据 第三个表应容纳来自的尽可能多的记录 第一张桌子*第二张桌子 在导入数据之前,应事先检查数据, 因为如果记录已经存在,导入过程将传递到下一个记录 这是我的问题 $queryS = "SELECT id FROM tabel where x=$x "; $resultS = $Databaseku->prepare($queryS); $resultS->execute(); while($dataS = $resultS->fet

第三个表将填充第一个表和第二个表中的数据

第三个表应容纳来自的尽可能多的记录 第一张桌子*第二张桌子

在导入数据之前,应事先检查数据, 因为如果记录已经存在,导入过程将传递到下一个记录

这是我的问题

$queryS = "SELECT id FROM tabel where x=$x ";
$resultS = $Databaseku->prepare($queryS);
$resultS->execute();    
while($dataS = $resultS->fetch())
{
    $id         = $dataS["id"]; 

    $queryK = "SELECT id FROM tabel2 where y=$y ";
    $resultK = $Databaseku->prepare($queryK);
    $resultK->execute();
    $j=1;
    while($dataK = $resultK->fetch())
    {
        $idK        = $dataK["id"];  

        $cekdata    = "select a,b,c from tabel3 where a=$id AND b=$idK"; 
        $ada        = mysql_query($cekdata) or die(mysql_error()); 

        if(mysql_num_rows($ada)>0) 
        {    
            //record-$j already. do nothing 
        } 

        else 
        {       
            $query = "INSERT IGNORE INTO tabel3 (a, b, c) VALUES (:a, :b, :c)";
            $result = $Databaseku->prepare($query); 
            $data  = array(                                     
                        ':a'    => $id,
                        ':b'    => $idK,
                        ':c'    => $c
                        );                  
            $result->execute($data);

            }
            $result=null;

        $j++;   
        }   
    $resultK=null;
    }

$resultS=null;

echo "Succed";
如果可能的话,不要在每次迭代中执行此查询,从tabel2中选择id,其中x=$x,从tabel3中选择a、b、c,其中d=$d。循环前做一次

按组插入数据,不要对每条记录执行Insert。例如,插入包含1000条记录的组:

INSERT IGNORE INTO tabel3 (a, b, c) VALUES 
(:a1, :b1, :c1), 
(:a2, :b2, :c2), 
...
(:a1000, :b1000, :c1000);
如果可能的话,不要在每次迭代中执行此查询,从tabel2中选择id,其中x=$x,从tabel3中选择a、b、c,其中d=$d。循环前做一次

按组插入数据,不要对每条记录执行Insert。例如,插入包含1000条记录的组:

INSERT IGNORE INTO tabel3 (a, b, c) VALUES 
(:a1, :b1, :c1), 
(:a2, :b2, :c2), 
...
(:a1000, :b1000, :c1000);

你的前提是可行的,但我质疑这样一个查询的意义,特别是如果它是定期运行的。只要按需运行一个连接查询来获取数据,似乎效率会更高。如果索引正确,查询200k条记录不会花费超过一两秒钟的时间。是的,您是对的,但更新后,表1和表2之间的左连接查询仍然很慢。。这可能是因为我使用innoDB而不是MyISAM吗?为什么不将表数据与索引一起发布呢。这是这里性能的关键——索引。200k记录算不了什么……可以在非常合理的时间内搜索数百万条记录。通过此查询,将IGNORE插入表3 a、b、c中选择表1.a、表2.b、表1.c从表1中选择表1.a、表2.b、表1.c在表1.years=表2.years中的LEFT JOIN程序,其中表2.years='$years'其工作不到8秒,130k条记录已完成,但是,当我需要验证记录是否已经存在时,导入过程将传递到下一个记录查询仍然需要1个小时才能完成您的前提工作,但是我怀疑这样一个查询的意义,特别是如果它正在定期运行的话。只要按需运行一个连接查询来获取数据,似乎效率会更高。如果索引正确,查询200k条记录不会花费超过一两秒钟的时间。是的,您是对的,但更新后,表1和表2之间的左连接查询仍然很慢。。这可能是因为我使用innoDB而不是MyISAM吗?为什么不将表数据与索引一起发布呢。这是这里性能的关键——索引。200k记录算不了什么……可以在非常合理的时间内搜索数百万条记录。通过此查询,将IGNORE插入表3 a、b、c中选择表1.a、表2.b、表1.c从表1中选择表1.a、表2.b、表1.c在表1.years=表2.years中的LEFT JOIN程序,其中表2.years='$years'其工作不到8秒,130k条记录已完成,但当我需要验证记录是否已经存在时,导入过程将传递到下一个记录查询,但仍需要1小时才能完成1。我需要它,因为我将使用$id表示a,使用$idK表示b2。我不知道怎么做。。因为表2和表3是动态的。在循环中填写$query。在while之前:$query=INSERT。。。价值观内部while:$query.=。。。。在while之后运行execute.1。我需要它,因为我将使用$id表示a,使用$idK表示b2。我不知道怎么做。。因为表2和表3是动态的。在循环中填写$query。在while之前:$query=INSERT。。。价值观内部while:$query.=。。。。在while运行之后执行。