重型Mysql操作&时间限制

时间:2012-11-23 15:21:30

标签: mysql

存在一个性能问题,我坚持使用基于PHP& MySQL的。该应用程序用于数据迁移,其中必须上载数据,并且在各种过程(从外来字符清除,重复检查,ID生成)之后,必须将其插入到一个中央表中,然后插入到5个不同的表中。在那里,生成一个id,并且必须将id更新到中央表。 有不同的记录和验证规则集。我面临的问题是,当我插入说(4K)行文件(包含20列)时,它在15分钟内正常工作,它被插入到处。但是,当我再次插入相同的记录时,此时需要花费一个小时来插入(理想情况下,它应该通过将先前插入的数据标记为重复来插入)。 在浏览完日志文件后,我注意到有一个Mysql select语句,我在检查重复项并获取重复的ID。然后我在for循环中调用一个函数,它基本上将记录插入到5个表中并将id更新到中央表。此调用功能是整个过程的主要时间。附:记录必须按记录插入。请提出一些解决方案..

//这是示例代码

$query=mysql_query("SELECT DISTINCT p1.ID


FROM table1 p1, table2 p2, table3 a
WHERE p2.datatype =0
AND (p1.datatype =1 || p1.datatype=2)
AND p2.ID =0 
AND p1.ID = a.ID
AND p1.coulmn1 = p2.column1
AND p1.coulmn2 = p2.coulmn2
AND a.coulmn3 = p2.column3");
$num=mysql_num_rows($query);
for($i=0;$i<$num;$i++)      {
$f=mysql_result($query,$i,"ID");
//calling function
RecordInsert($f);
}

1 个答案:

答案 0 :(得分:0)

如果没有您的代码,我只能为您提供解决方案的一般准则。基本上,在开始插入之前获取所有现有值。插入时,请检查此缓存列表以查看是否存在重复,而不是执行查询。插入后,将插入的项添加到缓存项列表中,以防它再次出现。如果您的表可能会添加到脚本之外,而脚本正在运行,那么只需锁定您正在使用的表,直到完成为止。