我有一個電子商務網站,許多舊產品從未使用過。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