Анализируя индексирование, думайте о NULL
как о «просто другом значении».
Ваш конкретный SELECT
мало что делает. Он выполнит «сканирование индекса», так как все необходимые столбцы (просто a
) находятся в INDEX inx_a (a)
(который у вас, очевидно, есть). То есть индекс «покрывает». Он не должен требовать «полного сканирования индекса» (просматривая все «строки»).
Да NULL
значения будут в индексе первыми; он должен выполнить «сканирование индекса» что-то вроде:
- Погружение в BTree индекса в начале.
- Считывание «строк», пока оно не достигнет чего-то другого, кроме
NULL
; поставить a
.
В некоторых случаях Оптимизатор игнорирует очевидное INDEX
и просто выполняет «сканирование таблицы», но здесь это не так. Например, поскольку большинство строк имеют a IS NULL
, очень вероятно, что следующее будет игнорировать индекс и выполнять сканирование таблицы:
SELECT a,b FROM t WHERE a IS NULL
OTOH, INDEX(a,b)
будет "индексом покрытия" и он должен выполнить «сканирование диапазона» в индексе.
Пожалуйста, укажите SHOW CREATE TABLE
, как текст, а не изображение , если вы будете sh, чтобы обсудить это далее.