индексировать битовое поле в MYSQL

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

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

select * from xxx where field=1;

3 ответов


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

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


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

ответ:

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

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

Так это зависит. Это зависит от запросов, и зависит от оптимизатора.

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


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


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

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