Хранится ли нулевое значение на дереве B + в MySQL? - PullRequest
0 голосов
/ 07 января 2020

mysql 5.7 innodb

ОБЪЯСНИТЬ ВЫБРАТЬ ИЗ test ГДЕ ЕСТЬ НЕДЕЙСТВИТЕЛЬНО;

a может быть нулевым, а нормальный индекс ; мы видим: Дополнительная информация: Использование где; используя индекс; это значение индекс хранит нулевое значение?

введите описание изображения здесь

1 Ответ

0 голосов
/ 07 января 2020

Анализируя индексирование, думайте о NULL как о «просто другом значении».

Ваш конкретный SELECT мало что делает. Он выполнит «сканирование индекса», так как все необходимые столбцы (просто a) находятся в INDEX inx_a (a) (который у вас, очевидно, есть). То есть индекс «покрывает». Он не должен требовать «полного сканирования индекса» (просматривая все «строки»).

Да NULL значения будут в индексе первыми; он должен выполнить «сканирование индекса» что-то вроде:

  1. Погружение в BTree индекса в начале.
  2. Считывание «строк», пока оно не достигнет чего-то другого, кроме NULL; поставить a.

В некоторых случаях Оптимизатор игнорирует очевидное INDEX и просто выполняет «сканирование таблицы», но здесь это не так. Например, поскольку большинство строк имеют a IS NULL, очень вероятно, что следующее будет игнорировать индекс и выполнять сканирование таблицы:

SELECT a,b FROM t WHERE a IS NULL

OTOH, INDEX(a,b) будет "индексом покрытия" и он должен выполнить «сканирование диапазона» в индексе.

Пожалуйста, укажите SHOW CREATE TABLE, как текст, а не изображение , если вы будете sh, чтобы обсудить это далее.

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