Задавайте вопросы, мы ответим
Вы не зашли.
Всем привет!
Подскажите, пожалуйста
есть такой запрос
UPDATE `products` p SET p.`sale` = 0 WHERE p.`autosale`;
В таблице products 87000 строк
на поле autosale стоит индекс, на поле sale нет индекса
Запрос выполняется 10 секунд
Можно ли как-то ускорить этот запрос? И в чем причина такой медленной работы?
Неактивен
А что Вы имели в виду в запросе выражением
WHERE p.`autosale`
?
Если бы было что-то вроде
WHERE p.`autosale` = 1
то индекс сработал бы в принципе.
Неактивен
именно это и имел ввиду WHERE p.`autosale` = 1
сейчас попробую
Неактивен
Напишите процентное соотношение тех записей, у которых autosale равен единичке по отношению к тем, у которых не равен - если количество записей, где autosale = 1 большое, то ожидать от индекса ускорения не приходится
Неактивен
Что-то не помогло
# Query_time: 10.724374 Lock_time: 0.000452 Rows_sent: 0 Rows_examined: 164571
SET timestamp=1417799415;
UPDATE `products` p SET p.`sale` = 0 WHERE p.`autosale` = 1;
Неактивен
Так какое процентное соотношение?
Неактивен
deadka написал:
Напишите процентное соотношение тех записей, у которых autosale равен единичке по отношению к тем, у которых не равен - если количество записей, где autosale = 1 большое, то ожидать от индекса ускорения не приходится
autosale = 1 у 77000 записей
autosale = 0 у 10000 записей, соответственно
Неактивен
Ну так Вы вообще почти все записи обновляете, как тут индекс поможет? Он даже использоваться не будет. Если нужна бОльшая скорость, то тут уже нужно скорее думать про оптимизацию железа.
Неактивен
Железо загружено далеко не на полную. На сервере 24 ядра и 48 GB оперативки
есть ли способ по-другому подойти к вопросу? Может быть делать это в цикле?
Неактивен
или может вот так?
SELECT `id` FROM `products` WHERE `sale`=1 AND `autosale`=0 // получаем список id которым не надо обнулять `sale` (сейчас их 220 и никогда не будет больше 1000 в будущем)
а потом
UPDATE `products` SET `sale` = 0 WHERE `id` NOT IN(список полученных id)
Неактивен
Какой тип таблицы, какие настройки хранилища, какие другие запросы выполняются
параллельно с этим?
Мы выяснили, что сам по себе запрос обновляет всю таблицу, индексы не использует
специально (и это хорошо), осталось настроить систему (включая хранилище)
Неактивен