#mysql #indexing #mariadb-10.3
#mysql #индексирование #mariadb-10.3
Вопрос:
У нас есть SQL-запрос, который выполняет полное сканирование таблицы:
DELETE
FROM oc_cart
WHERE (api_id > ? OR customer_id = ?)
AND date_added < DATE_SUB(NOW(), INTERVAL ? HOUR)
Возможно ли создать индекс для оптимизации этого запроса?
На данный момент я создал 2 индекса:
- один на date_added
- один на (date_added, customer_id и api_id)
Но, похоже, запрос все еще выполняет полное сканирование.
Комментарии:
1. Индекс в date_added является избыточным. (Я думаю, что я прав, говоря это) Другой индекс можно использовать только частично. Если (date_added, customer_id) не помогает, попробуйте (date_added,api_id) и попробуйте поменять местами порядок индексов. Вы могли бы использовать более научный подход, но здесь так мало перестановок, что будет быстрее просто «высосать и посмотреть»
Ответ №1:
Сколько строк в таблице? Что SHOW CREATE TABLE
обеспечивает ?
ОБЪЯСНЕНИЕ ВЫБОРА …`?
Невозможно сильно оптимизировать запрос.
Если api_id > ?
более выборочно, чем date added < ...
, то это может быть лучшим:
DELETE
FROM oc_cart
WHERE api_id > ?
AND date_added < DATE_SUB(NOW(), INTERVAL ? HOUR);
DELETE
FROM oc_cart
WHERE customer_id = ?
AND date_added < DATE_SUB(NOW(), INTERVAL ? HOUR);
вместе с этими двумя индексами:
INDEX(api_id, date_added)
INDEX(customer_id, date_added)
В случае api_is not
, если это выборочно, также добавьте
INDEX(date_added, api_id) (but _not_ INDEX(date_added))