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

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


person too much php    schedule 14.11.2008    source источник


Ответы (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.

person Chu Khanh Van    schedule 19.05.2013
comment
Обратите внимание, что в документации упоминаются некоторые предостережения, например. оптимизация может обрабатывать только один IS NULL. - person Timo; 29.11.2016

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

Будьте осторожны, когда вы запускаете это, потому что MySQL БЛОКИРУЕТ таблицу для ЗАПИСИ во время создания индекса. Создание индекса может занять некоторое время для больших таблиц, даже если столбец пуст (все пустые значения).

Справочник.

person Bill the Lizard    schedule 14.11.2008
comment
Как вы пришли к такому выводу? Не вижу упоминания темы. - person too much php; 14.11.2008
comment
Это было в комментариях под статьей. Я вытащил соответствующую часть. - person Bill the Lizard; 14.11.2008
comment
Я считаю, что причина, по которой для больших таблиц требуется некоторое время, заключается в том, что MySQL должен прочитать всю таблицу, а не потому, что она строит гигантский индекс. Я могу ошибаться. - person too much php; 14.11.2008
comment
@toomuchphp Да, на самом деле для больших таблиц требуется некоторое время ... даже если столбец ... все нули также могут быть интерпретированы, поскольку обработка нулей выполняется быстро [потому что они не индексируются], но если таблица огромна .. - person KajMagnus; 16.07.2012

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

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

person J.D. Fitz.Gerald    schedule 14.11.2008
comment
Вопрос заключался в том, увеличится ли индекс в размере. Ответ заключался в том, что это увеличит размер индекса во втором предложении. - person J.D. Fitz.Gerald; 07.09.2011
comment
title спрашивает, индексирует ли MySQL пустые столбцы (так и есть). Описание, кажется, задает несколько другой вопрос, но на самом деле это просто разъяснение того, почему вопрос (название) был задан в первую очередь. Более того, поскольку люди в основном решают, читать вопрос или нет, основываясь на его заголовке, я бы сказал, что в большинстве случаев форма заголовка имеет приоритет над формой описания. - person user359996; 09.09.2011
comment
Кроме того, разрешение нулевого столбца добавляет байт к строке, а не к столбцу, если только уже не существует (множество) 8 столбцов, допускающих значение NULL, поскольку нуль является растровым. Действительно, это может очень хорошо сэкономить пространство, поскольку нулевые значения нужно хранить только в растровом изображении. - person user359996; 09.09.2011
comment
В этом случае столбец INT, который имеет значение NULL в 90% случаев, занимает 1 или менее байтов в 90% случаев и от 4 до 5 байтов в 10% случаев. В среднем это значительно меньше, чем 4 байта, все время, что будет стоить без разрешения NULL. - person user359996; 09.09.2011

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

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

person dkretz    schedule 14.11.2008

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

person Alix    schedule 26.08.2016