MySQL индексирует нулевые значения? - PullRequest
53 голосов
/ 14 ноября 2008

У меня есть таблица mysql, где индексированный столбец INT будет 0 для 90% строк. Если я изменю эти строки, чтобы использовать NULL вместо 0, будут ли они исключены из индекса, что сделает индекс примерно на 90% меньше?

Ответы [ 5 ]

24 голосов
/ 19 мая 2013

http://dev.mysql.com/doc/refman/5.0/en/is-null-optimization.html

MySQL может выполнить ту же оптимизацию для col_name IS NULL, которую он может использовать для col_name = constant_value. Например, MySQL может использовать индексы и диапазоны для поиска NULL с IS NULL

7 голосов
/ 14 ноября 2008

Похоже, он тоже индексирует NULL s.

Будьте осторожны при запуске этого, потому что MySQL заблокирует таблицу для WRITES во время создания индекса. Построение индекса может занять некоторое время для больших таблиц, даже если столбец пуст (все нули).

Ссылка .

2 голосов
/ 14 ноября 2008

Если столбцу присвоено значение NULL, это добавит байт к требованиям к хранилищу столбца. Это приведет к увеличению размера индекса, что, вероятно, не очень хорошо. Тем не менее, если многие ваши запросы изменены на использование «IS NULL» или «NOT NULL», они могут быть в целом быстрее, чем сравнение значений.

Моя интуиция сказала бы мне не нуль, но есть один ответ: тест!

1 голос
/ 26 августа 2016

Каждый индекс имеет количество элементов, означающее, сколько индексируемых значений индексируется. AFAIK Не разумно говорить, что индексы повторяют одно и то же значение для многих строк, но индекс будет адресовать только повторное значение для кластеризованного индекса из многих строк (строк, имеющих нулевое значение для этого поля) и сохраняя ссылочный идентификатор кластеризованного индекса означает: каждая строка с индексированным полем NULL-значения теряет размер, равный PK (по этой причине эксперты рекомендуют иметь разумный размер PK, если у вас составной PK).

1 голос
/ 14 ноября 2008

Нет, он будет продолжать включать их, но не делайте слишком много предположений о том, каковы будут последствия в любом случае. Многое зависит от диапазона других значений (Google для "кардинальности").

MSSQL имеет новый тип индекса, называемый «фильтрованным индексом» для этого типа ситуации (т.е. включает в себя записи в индексе на основе фильтра). Системы типа dBASE имели аналогичные возможности, и это было довольно удобно.

...