У меня есть таблица MySQL, в которой индексированный столбец INT
будет равен 0 для 90% строк. Если я изменю эти строки, чтобы использовать NULL
вместо 0, будут ли они исключены из индекса, что сделает индекс примерно на 90% меньше?
Индексирует ли MySQL значения NULL?
Ответы (5)
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
.
Похоже, он тоже индексирует NULL
.
Будьте осторожны, когда вы запускаете это, потому что MySQL БЛОКИРУЕТ таблицу для ЗАПИСИ во время создания индекса. Создание индекса может занять некоторое время для больших таблиц, даже если столбец пуст (все пустые значения).
Разрешение столбцу быть пустым добавит байт к требованиям к хранилищу столбца. Это приведет к увеличению размера индекса, что, вероятно, не очень хорошо. Тем не менее, если многие ваши запросы изменены для использования «IS NULL» или «NOT NULL», они могут быть в целом быстрее, чем сравнение значений.
Моя интуиция подсказывала бы мне, что это не ноль, но ответ один: тест!
Нет, он будет по-прежнему включать их, но не делайте слишком много предположений о последствиях в любом случае. Многое зависит от диапазона других значений (погуглите "мощность").
MSSQL имеет новый тип индекса, называемый «фильтрованным индексом» для таких ситуаций (т. е. включает записи в индекс на основе фильтра). Системы типа dBASE раньше имели аналогичную возможность, и это было очень удобно.
Каждый индекс имеет кардинальность, означающую, сколько различных значений индексируется. Насколько я знаю, неразумно говорить, что индексы повторяют одно и то же значение для многих строк, но индекс будет адресовать повторяющееся значение только кластеризованному индексу многих строк (строки, имеющие нулевое значение для этого поля) и сохраняя ссылочный идентификатор кластеризованного индекса означает: каждая строка с индексированным полем со значением NULL тратит впустую размер, равный PK (по этой причине эксперты рекомендуют иметь разумный размер PK, если у вас есть составной PK).