Я - главным образом Разработчик ActionScript и ни в коем случае эксперт в SQL, но время от времени я должен разработать простой серверный материал. Так, я думал, что спрошу более опытных людей о вопросе в заголовке.
Мое понимание - то, что Вы не получаете много путем установки индекса в столбце, который будет содержать немного отличных значений. У меня есть столбец, который содержит булево значение (на самом деле, это - маленький интервал, но я использую его в качестве флага), и этот столбец используется в операторах Where большинства запросов, которые я имею. В теоретическом "среднем" случае половина значений записей будет 1 и другая половина, 0. Так, в этом сценарии механизм базы данных мог избежать полного сканирования таблицы, но должен будет считать много строк так или иначе (общие строки/2).
Так, я должен сделать этот столбец индексом?
Для записи я использую Mysql 5, но я больше интересуюсь общим объяснением на том, почему это делает / не имеет смысл, индексирующий столбец, что я знаю, что это будет иметь низкую кардинальность.
Заранее спасибо.
может быть стоить включая логическое поле в композитный индекс. Например, если у вас есть большая таблица сообщений, которые, как правило, надо Указано по дате, но у вас также есть булева поле поле , поэтому вы часто запрашиваете это:
SELECT ... FROM Messages WHERE Deleted = 0 AND Date BETWEEN @start AND @end
Вы обязательно выиграете от композитного индекса на Удалена и дата поля .
Я обычно делаю простой «у индекса» против «Нет» индекса. По моему опыту вы получаете большую часть производительности на запросах, которые используют порядок индексированной колонны. Если у вас есть какие-либо сортировки на этой колонне, индексация, скорее всего, поможет.
ИМХО это ограниченная полезность. Я предполагаю, что в большинстве случаев есть другие критерии, которые вы используете в ваших запросах, в дополнение к флагу, который, вероятно, помогает намного больше.
на 50%, я, вероятно, сделаю некоторую бенчмаркинг с / без и посмотреть, имеет ли он много раз разницей.
Как насчет функции readdirectorychangeSW?
http://msdn.microsoft.com/en-us/library/aa365465 (vs.85) .aspx
Он хранит уведомления в Буфер, чтобы вы не пропустите никаких изменений (если не переполняется буфером)
-121--2986154-Индекс может помочь даже на полях с низким уровнем мощности, если:
, когда одно из возможных значений очень нечастона по сравнению с другими значениями, и вы ищете его.
Например, есть очень немногие цветные слепые женщины, поэтому этот запрос:
Выберите *
От color_blind_people.
Где гендер = 'f'
, скорее всего, выиграет бы от указателя пола
.
Когда значения, как правило, сгруппированы в порядке таблицы:
Выбрать *
От Records_from_2008.
Где год = 2010
Ограничение 1.
Хотя здесь есть только 3
. Здесь, рекорды с более ранскими годами, скорее всего, скорее всего добавлены, поэтому очень много записей должны быть отсканированы до возвращения первой 2010
, если не для указателя.
Если вам нужно Заказать BY / LIMIT
:
Выберите *
От людей
СОРТИРОВАТЬ ПО
Пол, ID.
Ограничение 1.
Без индекса потребуется Filesort
. Хотя это несколько оптимизировано до предела
, ему все равно нужна полная таблица сканирования.
Когда индекс охватывает все поля, используемые в запросе:
Создать индекс (low_cardinality_record, значение)
Выберите сумму (значение)
От MyTable
Где low_cardinality_record = 3
Когда вам нужно Отчетность
:
Выберите отчетливый цвет
Из футболки
MySQL
будет использовать индекс для группы
для группы
, и если у вас есть несколько цветов, этот запрос будет мгновенным даже с миллионами записей.
Это пример сценария, когда индекс на поле низкого уровня кардинальности составляет , более эффективно
Обратите внимание, что если производительность DML
не так много по проблеме, то безопасно создать индекс.
Если оптимизатор считает, что индекс неэффективен, индекс просто не будет использоваться.