Каков наилучший способ создать индекс в 3 столбцах и возможно ли это?

#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))