MySQL Не используется лучший индекс - PullRequest
2 голосов
/ 26 марта 2020

У меня есть простой запрос на выборку:

SELECT *
FROM `inventory`
WHERE account_id = "1"
AND marketplace_id = "2"
AND sku = "3"
AND `date` = "4"

У него есть условие в четырех полях, поэтому естественный индекс состоит из этих четырех полей.

У меня есть следующие индексы: enter image description here

и когда я объясняю запрос, я получаю: enter image description here Говоря, что он использует второй индекс из списка, а не третий или 4-й.

Если я использую USE INDEX(account_id__marketplace_id__sku__date) в своем запросе, он успешно использует его и фильтрует 100%.

Я попытался ANALYZE TABLE и OPTIMIZE TABLE, чтобы перестроить индексы, но Ситуация остается прежней!

Из моего опыта работы с другими таблицами, если я сейчас отбрасываю индексы 2 и 3 и воссоздаю их так, чтобы самый большой индекс был первым в порядке, запрос выберет этот индекс Это означает, что он выбирает первое, которое соответствует максимальному соответствию.

  • MySQL Версия сервера : 5.7.25-google-log
  • phpMyAdmin MySQL версия клиента : 5.5.59

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Mysql выберет индекс по размеру данных таблицы; enter image description here

Вы можете попытаться вставить 600000 записей в инвентарь, сохранить случайное значение записи и запустить команду "Объяснить"

0 голосов
/ 26 марта 2020

Ваш пример кода имеет:

date = "1"

Это очень загадочно, потому что "1" не является допустимой датой. Что я заметил, так это отсутствие индексов date. Я предполагаю, что у вас есть проблема с преобразованием типов - и преобразование типов (и вызовы функций) может помешать использованию индексов.

Я был бы уверен, что все сравниваемые объекты имеют правильный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...