Должен ли я создавать индексы для типов полей tinyint в таблицах mysql? - PullRequest
8 голосов
/ 22 декабря 2009

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

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

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

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

Спасибо.

Ответы [ 5 ]

18 голосов
/ 22 декабря 2009

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

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

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

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

6 голосов
/ 22 декабря 2009

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

0 голосов
/ 22 декабря 2009

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

0 голосов
/ 22 декабря 2009

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

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

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

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

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

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