Должен ли я индексировать поле, если я буду искать только в поле FIELD? - PullRequest
1 голос
/ 12 ноября 2009

У меня есть таблица с полем даты и времени, обнуляемым.

Я выполню такие запросы:

select * from TABLE where FIELD is not null
select * from TABLE where FIELD is null

Должен ли я индексировать это поле или нет необходимости? Я НЕ буду искать какое-либо значение даты / времени в этом поле.

Ответы [ 3 ]

2 голосов
/ 12 ноября 2009

Это , вероятно, не обязательно.

Единственный возможный крайний случай, когда индекс может быть использован (и полезен), это если соотношение пустых / ненулевых строк довольно велико (например, у вас есть 100 NULL datetime в таблице с 100 000 строк). В этом случае select * from TABLE where FIELD is null будет использовать индекс и будет значительно быстрее для него.

1 голос
/ 12 ноября 2009

Короче говоря: да.

Чуть дольше: даааа. ; -)

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html) - «Поиск с использованием col_name IS NULL использует индексы, если col_name индексируется."

0 голосов
/ 12 ноября 2009

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

Например: если у вас есть таблица с 99% записей, столбец запросов имеет значение null, и вы поставили / имеете индекс для столбца, а затем выполните:

SELECT columnIndexed FROM blah WHERE columnIndexed is null;

Оптимизатор, скорее всего, не будет использовать индекс. Это не произойдет, потому что чтение индекса и последующее чтение связанных данных для записей будет стоить дороже, чем прямой доступ к таблице. Использование индекса основано на статистическом анализе таблицы, и одним из основных игроков в этом является количество значений. В целом, индексы работают лучше всего и дают лучшую производительность, когда они выбирают небольшое подмножество строк в таблице. Поэтому, если вы измените вышеуказанный запрос, чтобы выбрать, где columnIndexed не равно NULL, вы обязаны использовать индекс.

Для более подробной информации проверьте следующее: http://dev.mysql.com/doc/refman/5.1/en/myisam-index-statistics.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...