У меня есть сайт электронной коммерции со многими старыми продуктами, которые никогда не используются.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);
}
Сначала он работает очень быстро, когда я «шоу PROCESSLIST» Я вижу, что запрос взять 1 сек.
Но тогда он становится очень медленным, и запросы занимают 1 час.
Я работаю на QA srv, который не используется другими пользователями.
У меня есть много свободного места на диске (3.5G)
там 80308 продуктов в БД.
и 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. –
помог, все еще висит - | 74 | корень | localhost | prestashop2 | Запрос | 144 | Отправка данных | insert в deleted_products выберите p. * из продукта p, где p.should_delete = '1' limit 1 | –