it-swarm.com.ru

MySQL индексирует нулевые значения?

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

53
too much php

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

24
Chu Khanh Van

Похоже, что он также индексирует NULLs.

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

ссылка .

7
Bill the Lizard

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

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

2
J.D. Fitz.Gerald

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

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

1
dkretz

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

1
Alix