Как использовать индекс по списку значений? - PullRequest
0 голосов
/ 25 мая 2019

У меня есть запрос с объединением на mytable, индексированный по (col1, col2)

explain
...
join mytable on col1=1 and col2=2

показывает правильное использование индекса с type: eq_ref

Но при использованииlist индекс больше не используется

join mytable on col1=1 and col2 in (2,3,4)

Extra: Range checked for each record (index map: 0x1);

Это дает тот же результат:

join mytable on (col1,col2) in ((1,2),(1,3),(1,4))

Есть ли способ использовать индекс при предоставлениисписок значений?

1 Ответ

0 голосов
/ 26 мая 2019
  • Обычно никто не JOIN x ON c = constant. Предложение ON должно указывать, как эта таблица связана с другими таблицами. Предложение WHERE должно предусматривать фильтрацию, например col1=1 and col2=2.

  • «Конструкторы строк» ​​давно существуют, но только недавно (5.7.3) они были оптимизированы с наименьшим количеством битов. Какую версию вы используете? Даже с самой последней версией я бы ожидал, что col1=1 and col2 in (2,3,4) будет оптимизирован как минимум так же, как и подход с использованием конструктора строк.

  • OR часто предотвращает любую оптимизацию. И, возможно, это никогда не быстрее, чем какая-то альтернатива.

  • Нам нужно увидеть весь запрос, EXPLAIN и SHOW CREATE TABLE; в тени может скрываться другая проблема.

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