mysql слишком много индексов?

83

Я трачу некоторое время на оптимизацию нашей текущей базы данных.

Я специально смотрю на индексы.

Есть несколько вопросов:

  • Есть ли слишком много индексов?
  • Что ускорит работу индексов?
  • Что замедлит работу индексов?
  • Когда лучше добавить индекс?
  • Когда добавлять индекс - плохая идея?
  • Плюсы и минусы нескольких индексов по сравнению с индексами с несколькими столбцами?
Hailwood
источник

Ответы:

150

Что ускорит работу индексов?

Получение данных - операторы SELECT.

Что замедлит работу индексов?

Обработка данных - инструкции INSERT, UPDATE, DELETE.

Когда лучше добавить индекс?

Если вы чувствуете, что хотите повысить производительность поиска данных.

Когда добавлять индекс - плохая идея?

В таблицах, которые будут подвергаться тяжелым манипуляциям с данными - вставка, обновление ...

Плюсы и минусы нескольких индексов по сравнению с индексами с несколькими столбцами?

Запросы должны указывать порядок столбцов при работе с охватывающим индексом (индекс более чем одного столбца) слева направо в определении столбца индекса. Порядок столбцов в операторе не имеет значения, только порядок столбцов 1, 2 и 3 - оператор должен иметь ссылку на столбец 1, прежде чем можно будет использовать индекс. Если есть только ссылка на столбец 2 или 3, индекс покрытия для 1/2/3 использовать нельзя.

В MySQL для каждого оператора SELECT / в запросе можно использовать только один индекс (подзапросы / и т. Д. Рассматриваются как отдельный оператор). И есть ограничение на количество пространства для таблицы, которое позволяет MySQL. Кроме того, выполнение функции в индексированном столбце делает индекс бесполезным - IE:

WHERE DATE(datetime_column) = ...
OMG Пони
источник
11
вау, эта информация действительно прекрасно структурирована и очень полезна! И наиболее полезным для меня было то, что индекс, к которому применяется функция, бесполезен ... спасибо за этот ответ!
Крис
2
@OMG, Что касается вашего последнего абзаца, selectиз-за слияния индексов можно использовать более одного индекса. percona.com/blog/2012/12/14/…
Pacerier
1
-1 для того, чтобы сказать (1) это только ускоряет "SELECT", это ускоряет запросы SELECT, UPDATE и DELETE, при условии, что индексы правильно созданы в соответствии с условиями "WHERE", но требует обновления индексов при манипулировании данными, что означает что только запросы INSERT будут медленнее (во всех случаях), чем без индексов, и (2) для того, чтобы сказать, что MySQL может использовать только один индекс за раз.
Patrick
То же, что @PatrickAllaert -1 для вводящей в заблуждение информации об обновлении, удалить
Eimsas
64

Я не согласен с некоторыми ответами на этот вопрос.

Есть ли слишком много индексов?

Конечно. Не создавайте индексы, которые не используются ни в одном из ваших запросов. Не создавайте избыточных индексов. Используйте такие инструменты, как pt-duplicate-key-checker и pt-index-usage, чтобы найти индексы, которые вам не нужны.

Что ускорит работу индексов?

  • Условия поиска в предложении WHERE.
  • Условия присоединения.
  • Некоторые случаи ORDER BY.
  • Некоторые случаи GROUP BY.
  • УНИКАЛЬНЫЕ ограничения.
  • FOREIGN KEY ограничения.
  • ПОЛНОТЕКСТОВЫЙ поиск.

В других ответах сообщалось, что INSERT / UPDATE / DELETE медленнее, чем больше у вас индексов. Это правда, но учтите, что во многих случаях использования UPDATE и DELETE также есть предложения WHERE, а в MySQL UPDATE и DELETE также поддерживают JOIN. Индексы могут принести пользу этим запросам больше, чем компенсировать накладные расходы на обновление индексов.

Кроме того, InnoDB блокирует строки, затронутые операциями UPDATE или DELETE. Они называют это блокировкой на уровне строк, но на самом деле это блокировка на уровне индекса. Если нет индекса для сужения поиска, InnoDB должен заблокировать намного больше строк, чем конкретная строка, которую вы изменяете. Он может даже заблокировать все строки в таблице. Эти блокировки блокируют изменения, сделанные другими клиентами, даже если они не конфликтуют логически.

Когда лучше добавить индекс?

Если вы знаете, что вам нужно выполнить запрос, который выиграет от индексации в одном из вышеуказанных случаев.

Когда добавлять индекс - плохая идея?

Если индекс является левым префиксом другого существующего индекса или индекс не помогает ни одному из запросов, которые необходимо выполнить.

Плюсы и минусы нескольких индексов по сравнению с индексами с несколькими столбцами?

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

Для одного из моих клиентов-консультантов я определил многостолбцовый индекс для таблицы "многие ко многим", где индекса не было, и улучшил их запрос на соединение в 94 миллиона раз!

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

См. Также мою презентацию « Как правильно разрабатывать индексы» .

Билл Карвин
источник
10
+1 за «... учтите, что во многих случаях использования UPDATE и DELETE также есть предложения WHERE, а в MySQL, UPDATE и DELETE также поддерживают JOIN. Индексы могут принести пользу этим запросам больше, чем компенсировать накладные расходы на обновление индексов».
Роб Крейг
1
Это должен быть принятый ответ на то, что при обновлении и удалении учитываются пункты where.
Леонардо Эмилио Домингес
1
Это правильный ответ, тот, который отмечен как правильный, неправильный.
Eimsas
7

Есть ли слишком много индексов?

Индексы должны быть информированы о проблеме: таблицы, запросы, которые будет запускать ваше приложение, и т. Д.

Что ускорит работу индексов?

ВЫБОР.

Что замедлит работу индексов?

INSERT будет медленнее, потому что вам нужно обновить индекс.

Когда лучше добавить индекс?

Когда вашему приложению требуется еще одно предложение WHERE.

Когда добавлять индекс - плохая идея?

Когда вам не нужно запрашивать или применять ограничения уникальности.

Плюсы и минусы нескольких индексов по сравнению с индексами с несколькими столбцами?

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

Duffymo
источник
4

Есть ли слишком много индексов?

Да. Не выходить надеюсь создавать индексы, создавать их по мере необходимости.

Что ускорит работу индексов?

Любые запросы к таблице / представлению индексов.

Что замедлит работу индексов?

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

Когда лучше добавить индекс?

Когда запрос не выполняется с приемлемой скоростью. Вы можете фильтровать записи, которые не являются частью кластерного PK, и в этом случае вам следует добавить индексы на основе фильтров, которые вы ищете (если производительность сочтет нужным).

Когда добавлять индекс - плохая идея?

Когда вы делаете это ради этого - то есть чрезмерной оптимизации.

Плюсы и минусы нескольких индексов по сравнению с индексами с несколькими столбцами?

Зависит от запросов, которые вы пытаетесь улучшить.

Об / мин1984
источник
3

Есть ли слишком много индексов?

Да, как и все остальное, слишком много индексов замедлит манипуляции с данными.

Когда лучше добавить индекс?

Хорошая идея добавить индекс - это когда ваши запросы слишком медленные (т. Е. У вас слишком много соединений в ваших запросах). Эту оптимизацию следует использовать только после того, как вы построили твердую модель, чтобы настроить производительность.

Дэниел Фатх
источник