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运行之后执行。