Как оптимизировать sql-запрос?

Добрый день.

Есть таблица на 2,5 млн записей.
Есть запрос:
UPDATE `table`
    SET `flag` = 1 
WHERE 1
    AND `flag` = 0
    AND `datetime_a` IS NULL
    AND `datetime_b` IS NOT NULL 
    AND `datetime_b` < '2020-03-22 16:00:00'

Запрос выполняется за 5 секунд. Что с индексами на полях, что нет.
Можно ли это оптимизировать - сократить время выполнения запроса?
  • Вопрос задан
  • 3102 просмотра
Пригласить эксперта
Ответы на вопрос 6
dimonchik2013
@dimonchik2013
non progredi est regredi
AND `datetime_b` IS NOT NULL лишнее
Ответ написан
@immelnikoff
Изучаю БД
... WHERE 1 ...
Для чего эта 1 ?

Попробуйте так:
UPDATE `table`
    SET `flag` = 1 
WHERE
    `datetime_b` < '2020-03-22 16:00:00'
    AND `datetime_a` IS NULL
    AND `flag` = 0;

При этом для более быстрого выполнения данного запроса нужен индекс только на поле datetime_b.
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Идеальным вариантом будет купить букварь по работе с БД и убрать поле flag из таблицы совсем.
Ответ написан
@edo1h
Я всегда начинаю с select *. Если отрабатывает быстро — значит медленное именно обновление данных (много индексов, например). Если медленно — его и оптимизируем.
Ответ написан
Комментировать
alexfilus
@alexfilus
Senior backend developer
Вы обновляете половину записей в таблице. Индексы тут не помогают, а наоборот вредят, так как их надо перестраивать.
Удалить индексы, выполнить апдейт и создать не быстрее будет?
Ответ написан
@Minu
Сколько записей обновляется запросом?
Выполните
SELECT count(1)
FROM `table` 
WHERE 1
    AND `flag` = 0
    AND `datetime_a` IS NULL
    AND `datetime_b` IS NOT NULL 
    AND `datetime_b` < '2020-03-22 16:00:00'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы