индекс по столбцу, который используется только для IS NULL и IS NOT NULL - PullRequest
8 голосов
/ 06 ноября 2011

У меня в таблице есть столбец , удаленный . В каждом операторе sql я проверяю, является ли этот флаг НУЛЬ. Если кто-то хочет удалить записи, флаг установлен на текущую метку времени.

В случае восстановления записей эта метка времени используется для их восстановления. Это единственный вариант использования, когда будет использоваться значение этого столбца.

Во всех остальных случаях важно знать, НУЖНО ли оно или НЕДЕЙСТВИТЕЛЬНО.

В будущем таблица может и будет содержать миллионы строк.

Полезно ли создавать индекс для этого столбца? Потому что 99% утверждений и вариантов использования не заботятся о ценности. Оптимизирует ли MySQL условия IS NULL и, следовательно, индекс не нужен?

Ответы [ 3 ]

2 голосов
/ 06 ноября 2011

Индекс «удален» также индексирует нулевые значения, и, таким образом, ускоряет поиск ненулевых / нулевых

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

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

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

1 голос
/ 06 ноября 2011

Не можете ли вы создать «архивную» таблицу и сохранить удаленные строки с их отметкой времени.Если пользователь хочет восстановить строку, вам просто необходимо перенести ее из архива в основную таблицу.

И вам не нужно проверять «флаг НЕ НЕТ» в каждом запросе

0 голосов
/ 06 ноября 2011
  1. Согласно этой книге ( High Performance MySQL, 2nd Edition ) не рекомендуется использовать «allow NULL» в определении столбцов в MySQL.MySQL использует дополнительный байт для хранения статуса ячейки (Null или не Null), а размер индекса будет больше, чем без «allow NULL».Лучшее решение - создать тип данных TINYINT строки и сохранить значение 1 для активных строк и 0 для удаленных строк.Поэтому рекомендуется никогда не использовать allow NULL в определении столбца.
...