Должен ли я создавать индексы для типов полей tinyint в таблицах mysql?
Я просто работал над веб-приложением и обнаружил, что большинство таблиц mysql имеют поля, такие как is_live, can_do, required, published
(и многие другие), имеющие тип поля TINYINT, и принимает либо 0 or 1
только. Мне просто интересно, нужно ли создавать индексы на этих столбцах, поскольку скрипты используют соединения, которые также включают эти столбцы. Поэтому вопросы :
следует ли добавлять индексы и к этим столбцам?
должен ли я изменить тип на что-нибудь еще?
см. этот вопрос больше связан с пониманием концепции, чем с решением проблемы.
спасибо.
5 ответов
мой гуру базы данных говорит: "никогда не добавляйте индекс, Если вы не знаете запрос". В вашем случае, похоже, вы знаете запроса. Так что да, мы можем подумать об индексе. Если у вас есть тип хранилища данных системы, создайте растровый индекс. в противном случае не создавайте индекс. Индексы B-дерева плохи на таких небольших столбцах мощности.
общий совет заключается в том, что индекс в логическом поле редко будет полезен.
индексы B-дерева наиболее эффективны для данных высокой мощности (т. е. столбцов со многими возможными значениями, где данные в столбце уникальны или почти уникальны).
некоторые ядра баз данных, такие как Oracle и Postgres, поддерживают Растровые Индексы. Растровые индексы традиционно считаются хорошо работающими для таких данных, как Пол (Мужской или женский), который имеет небольшое количество различных значений, но со многими вхождениями этих значений.
MySQL в настоящее время не поддерживает растровые индексы, но может достичь аналогичной функциональности, используя свою функцию "index_merge". Растровые индексы должны быть введены с двигателем Falcon (источник).
Я сомневаюсь, что эти поля используются в соединениях, как они принимают 0 или 1 в качестве входных данных.
основным использованием индекса в этом случае будет возможность извлечения данных непосредственно из индекса, но поскольку индекс будет довольно большим, накладные расходы, скорее всего, сделают это неэффективным.
однако единственный правильный подход здесь-попробовать свой набор данных, так как данные, которые вы используете, могут оказать значительное влияние на результат.
Я не думаю, что вы должны добавлять индексы в эти поля, потому что они не содержат разных и много данных. Однако, что касается типа полей, вы можете рассмотреть перечисление тип.
решение о том, индексировать или нет, не должно зависеть от типа данных, а от
- как часто вы ищите в поле
- сколько записей в таблице (порядок)
- является ли ожидание неиндексированного запроса (полное сканирование таблицы) приемлемым для пользователя