我有一个电子商务网站,许多旧产品从未使用过。MySql挂起更新并插入
我写了一个代码来找到这些产品,并将它们移动到另一个表。
该代码找到应该删除的产品并用列标记should_delete = 1;
这里是复制的产品代码(计数=产品的数量删除):
while ($count>0)
{
if ($db->Execute("insert into delete_product select p.* product p where p.should_delete ='1' limit 500")){
$db->Execute("update product p set p.should_delete='2' where p.id_product in (SELECT `id_product` FROM deleted_products)");
}
$count-= 500;
sleep(1);
}
起初它运行速度非常快,当我做“SHOW PROCESSLIST”我看到,查询取1秒。
但后来变得非常慢,查询需要1个小时。
我在QA srv上运行,未被其他人使用。
我有很多的可用磁盘空间(3.5G)
有80308的产品在DB。
和29511标记为删除。
的数据库InnoDB的
它现在正在运行了一段时间,但只有在复制6500。
“显示processlist的”显示“正在发送数据”状态
我缺少什么?为什么这些简单的查询太慢?
我能够提高第二查询 -
update product p
join deleted_products dp on p.id_product = dp.id_product
set p.should_delete='2'
where p.should_delete='1'
但插入仍然挂起。
这里也挂着同样的代码的另一个版本 -
while ($count>0)
{
$fname = microtime(true);
$db->Execute("SELECT * FROM product p where p.should_delete='1' LIMIT 500 INTO OUTFILE '/tmp/".$fname.".txt'");
if ($db->Execute("LOAD DATA INFILE '/tmp/".$fname.".txt' INTO TABLE deleted_products"
)){
$db->Execute("update product p join deleted_products dp on p.id_product = dp.id_product set p.should_delete='2' where p.$should_delete='1'");
}
$count-= 500;
sleep(1);
}
这个版本挂起 -
58 | root | localhost | prestashop2 | Query | 29192 | NULL | LOAD DATA INFILE '/tmp/1414615714.6019.txt' INTO TABLE deleted_products
它看起来像deleted_products莫名其妙地锁,但是这是新的我创建的表,没有其他地方在代码中引用,没有其他人使用这个srv。
看来我发现了一个解决方案,我将步骤从500改为1. – 2014-10-30 05:57:43
确实有帮助,仍然挂起 - | 74 | root | localhost | prestashop2 |查询| 144 |发送数据|插入到deleted_products中从p产品中选择p。*,其中p.should_delete ='1'limit 1 | – 2014-10-30 06:44:33