Должен ли я создавать индексы для типов полей tinyint в таблицах mysql?

Я просто работал над веб-приложением и обнаружил, что большинство таблиц mysql имеют поля, такие как is_live, can_do, required, published (и многие другие), имеющие тип поля TINYINT, и принимает либо 0 or 1 только. Мне просто интересно, нужно ли создавать индексы на этих столбцах, поскольку скрипты используют соединения, которые также включают эти столбцы. Поэтому вопросы :

следует ли добавлять индексы и к этим столбцам?

должен ли я изменить тип на что-нибудь еще?

см. этот вопрос больше связан с пониманием концепции, чем с решением проблемы.

спасибо.

5 ответов


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


общий совет заключается в том, что индекс в логическом поле редко будет полезен.

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

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

MySQL в настоящее время не поддерживает растровые индексы, но может достичь аналогичной функциональности, используя свою функцию "index_merge". Растровые индексы должны быть введены с двигателем Falcon (источник).


Я сомневаюсь, что эти поля используются в соединениях, как они принимают 0 или 1 в качестве входных данных.

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

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


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


решение о том, индексировать или нет, не должно зависеть от типа данных, а от

  • как часто вы ищите в поле
  • сколько записей в таблице (порядок)
  • является ли ожидание неиндексированного запроса (полное сканирование таблицы) приемлемым для пользователя