Прекращает ли команда «SELECT ... WHERE 1» MySQL использование индекса? - PullRequest
2 голосов
/ 07 мая 2020

MySQL / MariaDB имеет log_queries_not_using_indexes включен, и этот запрос отображается в журнале:

SELECT * FROM `client` WHERE 1 ORDER BY `code` ASC;

Таблица client имеет индекс BTREE, определенный столбцом code. Мне любопытно, почему его не использовали. Я понимаю, что индексы можно использовать с простым упорядочиванием .

Индекс не используется из-за предложения WHERE 1 в запросе? Или в таком простом запросе индекс просто не нужен?

Это академический c для меня, запрос уже выполняется быстро.

Ответы [ 2 ]

1 голос
/ 08 мая 2020

log_queries_not_using_indexes, на мой взгляд, бесполезен. Если запрос выполняется достаточно медленно, чтобы иметь значение, он будет отображаться в журнале замедления без этой настройки. А настройка просто загромождает медленный журнал.

WHERE 1 эквивалентно отсутствию предложения WHERE.

Оптимизатор рассмотрит с помощью INDEX(code), если у вас есть такой, чтобы избежать сортировки. Но ...

План A: Используйте такой индекс, но вам нужно перемещаться между BTree индекса и BTree данных.

План B: игнорировать индекс, но необходимо сделать вид. («Сортировка» может выполняться в памяти, а может и не выполняться. Например, столбец TEXT предотвратит сортировку в ОЗУ.)

Оптимизатор делает приблизительную оценку того, что будет более эффективным. То есть он может сознательно решить не использовать индекс, что приведет к «шуму» в журнале замедления. Повторяю, выключите этот флаг.

1 голос
/ 07 мая 2020

Нет, это не имеет отношения к WHERE 1. Это связано с тем, что получение всех строк построчно после обхода индекса btree в коде, вероятно, будет медленнее, чем считывание всей партии в память и выполнение сортировки.

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