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

时间:2016-01-05 19:00:51

标签: php mysql pdo

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

第三个表应该容纳尽可能多的记录 (第一张表)*(第二张表)

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

这是我的查询

$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";

1 个答案:

答案 0 :(得分:0)

  1. 如果可能SELECT id FROM tabel2 where x=$xselect a,b,c from tabel3 where d=$d,请不要在每次迭代时执行此查询。在循环之前做一次。

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

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