Когда один показатель лучше, чем два в MYSQL - PullRequest
0 голосов
/ 11 декабря 2011

Я читал о том, когда вы создаете многоколонный индекс, который имеет значение для порядка и, как правило, вы хотите, чтобы столбцы появлялись в предложениях WHERE раньше, чем другие, которые были бы в ORDER BY и т. Д. Однако вы тоже не будетеполучить ускорение, если вы просто индексировать каждый из них в отдельности?(очевидно, не так, как мои собственные эксперименты показывают мне, что поведение комбинированного индекса может быть намного быстрее, чем простое индексирование каждого отдельно).Когда следует использовать многоколонный индекс и какие типы запросов он стимулирует?

Ответы [ 3 ]

3 голосов
/ 11 декабря 2011

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

Кроме того, имейте в виду, что если у вас есть многостолбцовый индекс, но вы не используете первый столбец, индексированный многостолбцовым индексом (или иначе не начинаете с начала и оставайтесь рядом с ранее использованным индексы), многостолбцовый индекс не принесет никакой пользы. (Например, если у меня есть индекс по столбцам [B, C, D], но есть WHERE, который использует только [C, D], этот многостолбцовый индекс не принесет пользы.)

Ссылка: http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html:

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

2 голосов
/ 11 декабря 2011

Короткий ответ: «это зависит».

Длинный ответ таков: если вы иногда делаете

 WHERE COL1 = value1 and COL2 = value2

, а иногда делаете

 WHERE COL1 = value1

но никогда или почти никогда не делайте

 WHERE COL2 = value2

, тогда составной индекс на (COL1, COL2) будет вашим лучшим выбором.(Верно для mySQL, а также для других производителей и моделей СУБД.)

Дополнительные индексы замедляют операции INSERT и UPDATE, поэтому они не бесплатны.

1 голос
/ 11 декабря 2011

Составной индекс (c1, c2) очень полезен в следующих случаях:

  1. Очевидный случай, когда c1 = v1 И c2 = v2
  2. Если вы делаете ГДЕ c1 = v1 И c2 МЕЖДУ v2 и v3 - выполняется «сканирование диапазона» составного индекса
  3. SELECT ... ОТ ГДЕ c1 = v1 ORDER BY c2 - в этом случае он может использовать индекс для сортировки результатов.
  4. В некоторых случаях в качестве «индекса покрытия», например, «SELECT c1, c2 ОТ ГДЕ c1 = 4» может игнорировать содержимое таблицы и просто извлечь (диапазон) из индекса.
...