Имеет смысл использовать индекс, который будет иметь низкую кардинальность?

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

Мое понимание - то, что Вы не получаете много путем установки индекса в столбце, который будет содержать немного отличных значений. У меня есть столбец, который содержит булево значение (на самом деле, это - маленький интервал, но я использую его в качестве флага), и этот столбец используется в операторах Where большинства запросов, которые я имею. В теоретическом "среднем" случае половина значений записей будет 1 и другая половина, 0. Так, в этом сценарии механизм базы данных мог избежать полного сканирования таблицы, но должен будет считать много строк так или иначе (общие строки/2).

Так, я должен сделать этот столбец индексом?

Для записи я использую Mysql 5, но я больше интересуюсь общим объяснением на том, почему это делает / не имеет смысл, индексирующий столбец, что я знаю, что это будет иметь низкую кардинальность.

Заранее спасибо.

38
задан a_horse_with_no_name 10 July 2019 в 05:38
поделиться

4 ответа

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

SELECT ... FROM Messages WHERE Deleted = 0 AND Date BETWEEN @start AND @end

Вы обязательно выиграете от композитного индекса на Удалена и дата поля .

9
ответ дан 27 November 2019 в 03:21
поделиться

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

3
ответ дан 27 November 2019 в 03:21
поделиться

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

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

2
ответ дан 27 November 2019 в 03:21
поделиться

Как насчет функции readdirectorychangeSW?

http://msdn.microsoft.com/en-us/library/aa365465 (vs.85) .aspx

Он хранит уведомления в Буфер, чтобы вы не пропустите никаких изменений (если не переполняется буфером)

-121--2986154-

Индекс может помочь даже на полях с низким уровнем мощности, если:

  1. , когда одно из возможных значений очень нечастона по сравнению с другими значениями, и вы ищете его.

    Например, есть очень немногие цветные слепые женщины, поэтому этот запрос:

     Выберите *
    От color_blind_people.
    Где гендер = 'f'
     

    , скорее всего, выиграет бы от указателя пола .

  2. Когда значения, как правило, сгруппированы в порядке таблицы:

     Выбрать *
    От Records_from_2008.
    Где год = 2010
    Ограничение 1.
     

    Хотя здесь есть только 3 . Здесь, рекорды с более ранскими годами, скорее всего, скорее всего добавлены, поэтому очень много записей должны быть отсканированы до возвращения первой 2010 , если не для указателя.

  3. Если вам нужно Заказать BY / LIMIT :

     Выберите *
    От людей
    СОРТИРОВАТЬ ПО
      Пол, ID.
    Ограничение 1.
     

    Без индекса потребуется Filesort . Хотя это несколько оптимизировано до предела , ему все равно нужна полная таблица сканирования.

  4. Когда индекс охватывает все поля, используемые в запросе:

     Создать индекс (low_cardinality_record, значение)
    
    Выберите сумму (значение)
    От MyTable
    Где low_cardinality_record = 3
     
  5. Когда вам нужно Отчетность :

     Выберите отчетливый цвет
    Из футболки
     

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

    Это пример сценария, когда индекс на поле низкого уровня кардинальности составляет , более эффективно

Обратите внимание, что если производительность DML не так много по проблеме, то безопасно создать индекс.

Если оптимизатор считает, что индекс неэффективен, индекс просто не будет использоваться.

74
ответ дан 27 November 2019 в 03:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: