индексировать битовое поле в MYSQL - PullRequest
6 голосов
/ 07 марта 2011

обновленный вопрос:Предположим, что данные, которые меня интересуют, - это только те, у которых поле = 1, а фактическое соотношение данных, где поле 1 равно 0, очень мало (например, 1%), в этом случае будет индексировать преимущество поля my select где field =1 запрос?

оригинальный вопрос:У меня есть поле int, которое будет иметь значение 0 или 1, будет ли индексирование этого поля ускорить запросы выбора, такие как:

select * from xxx where field=1;

Ответы [ 3 ]

4 голосов
/ 07 марта 2011

Вообще говоря, нет. Поле с двумя состояниями не ускоряет запросы при индексации, потому что в среднем приходится просматривать половину строк. Вы хотите, чтобы ваши записи индекса были выборочными - данная запись в индексе должна представлять лишь небольшой процент возможных значений (скажем, менее 10%, предпочтительно в долях процента). Затем при использовании индекса игнорируется большая часть данных в таблице, что дает вам выигрыш в производительности.

Некоторые СУБД поддерживают растровые индексы. Они могут помочь, но вы все еще сталкиваетесь с проблемой избирательности.


В обновленном вопросе говорится, что число значений со значением 1 будет небольшим (менее одного процента); будет ли индекс сейчас приносить вам пользу?

Ответ:

  • Для тех запросов, в которых вы указываете, что значение равно 1, тогда да, индекс столбца может обеспечить преимущество при условии, что оптимизатор фактически использует этот индекс. Возможно, вам придется настроить СУБД, чтобы она поняла, что индекс искажен в пользу использования его с запросами, где значение равно 1; это, как правило, специфично для СУБД, но обновление статистики в разных ипостасях - это название игры, возможно, с использованием подсказок и в запросах SQL. Конечно, если оптимизатор никогда не использует индекс, он все равно не дает никакой пользы - и оптимизатор может решить, что другие индексы каким-то образом ему помогут.

  • Для тех запросов, где значение равно 0, индекс не должен использоваться. Однако есть вероятность, что СУБД продолжит поддерживать индекс для значений 0 - даже если им никогда не следует их использовать. Это была бы необычная СУБД, которой можно было бы дать команду «только индексировать этот столбец для значений, отличных от нуля», даже если это было бы очень полезно.

Итак - это зависит. Это зависит от запросов и оптимизатора.

Обратите внимание, что составной индекс - для некоторых других обычно используемых столбцов, а затем для битового поля - вполне может обеспечить некоторое преимущество. Таким образом, если вы почти всегда выбираете диапазон дат, то составной индекс по столбцам даты и битового поля (вероятно, в таком порядке) должен предоставить вам хороший индекс.

0 голосов
/ 27 апреля 2017

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

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

0 голосов
/ 07 марта 2011

Да.Но вы, возможно, не захотите принять последующее снижение производительности для обновлений для такого небольшого поля;если ваши строки 50/50 0 или 1, полное сканирование таблицы все еще может быть целесообразным.

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