MySQL слишком много индексов? - PullRequest
73 голосов
/ 08 ноября 2010

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

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

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

  • Есть ли такая вещь, как слишком много индексов?
  • Что ускорят индексы?
  • Что замедлит индексы?
  • Когда стоит добавить индекс?
  • Когда плохая идея добавить индекс?
  • За и против многократных индексов против многоколоночных индексов?

Ответы [ 5 ]

130 голосов
/ 08 ноября 2010

Что ускорят индексы?

Извлечение данных - операторы SELECT.

Что замедлит индексы?

Обработка данных - операторы INSERT, UPDATE, DELETE.

Когда стоит добавить индекс?

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

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

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

"за" и "против" нескольких индексов против многоколоночных индексов?

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

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

WHERE DATE(datetime_column) = ...
57 голосов
/ 13 декабря 2012

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

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

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

Что ускорят индексы?

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

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

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

Когда стоит добавить индекс?

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

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

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

За и против многократных индексов против многоколоночных индексов?

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

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

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

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

7 голосов
/ 08 ноября 2010

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

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

Что ускорят индексы?

ВЫБИРАЕТ.

Что замедлит индексы?

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

Когда стоит добавить индекс?

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

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

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

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

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

4 голосов
/ 08 ноября 2010

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

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

Что ускорят индексы?

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

Что замедлит индексы?

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

Когда стоит добавить индекс?

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

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

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

За и против множественных индексов против многоколоночных индексов?

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

3 голосов
/ 08 ноября 2010

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

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

Когда стоит добавить индекс?

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

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