Вы можете сами подтвердить, какие индексы используются для данного запроса, используя EXPLAIN .
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: RatingTable
type: index
possible_keys: ban_index
key: rating_index
key_len: 5
ref: NULL
rows: 10
Extra: Using where
Вы должны изучить эту страницу руководства, чтобы получить объяснение вывода: https://dev.mysql.com/doc/refman/8.0/en/explain-output.html
Я ожидаю, что для вашего запроса нельзя использовать индекс с помощью выражения.
WHERE (BanMask & (1 << 2)) > 0
В отчете EXPLAIN показано:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: RatingTable
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 10
Extra: Using where; Using filesort
В общем случае индекс нельзя использовать, если на ваш индексированный столбец в левой части оператора сравнения есть ссылка в выражении или вфункция.Это должен быть «пустой» столбец.
Индексы работают при поиске значений, которые находятся вместе в порядке сортировки индекса.Ваш пример ищет каждое 4-е значение в BanMask, те, у которых установлен бит в 4-м месте.Эти значения не являются последовательными, они распределены.MySQL не будет использовать индекс для поиска во всем диапазоне значений, подобных этому, потому что в конечном итоге это будет так же дорого, как сканирование всей таблицы.
Что касается вашего второго вопроса, о добавлении индекса на (Rating DESC, BanMask ASC)
, ответ может помочь избежать сортировки файлов.Но это не поможет найти BanMask.
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: RatingTable
partitions: NULL
type: index
possible_keys: NULL
key: Rating
key_len: 10
ref: NULL
rows: 10
Extra: Using where