Что ускорит работу индексов?
Получение данных - операторы SELECT.
Что замедлит работу индексов?
Обработка данных - инструкции INSERT, UPDATE, DELETE.
Когда лучше добавить индекс?
Если вы чувствуете, что хотите повысить производительность поиска данных.
Когда добавлять индекс - плохая идея?
В таблицах, которые будут подвергаться тяжелым манипуляциям с данными - вставка, обновление ...
Плюсы и минусы нескольких индексов по сравнению с индексами с несколькими столбцами?
Запросы должны указывать порядок столбцов при работе с охватывающим индексом (индекс более чем одного столбца) слева направо в определении столбца индекса. Порядок столбцов в операторе не имеет значения, только порядок столбцов 1, 2 и 3 - оператор должен иметь ссылку на столбец 1, прежде чем можно будет использовать индекс. Если есть только ссылка на столбец 2 или 3, индекс покрытия для 1/2/3 использовать нельзя.
В MySQL для каждого оператора SELECT / в запросе можно использовать только один индекс (подзапросы / и т. Д. Рассматриваются как отдельный оператор). И есть ограничение на количество пространства для таблицы, которое позволяет MySQL. Кроме того, выполнение функции в индексированном столбце делает индекс бесполезным - IE:
WHERE DATE(datetime_column) = ...
select
из-за слияния индексов можно использовать более одного индекса. percona.com/blog/2012/12/14/…Я не согласен с некоторыми ответами на этот вопрос.
Конечно. Не создавайте индексы, которые не используются ни в одном из ваших запросов. Не создавайте избыточных индексов. Используйте такие инструменты, как pt-duplicate-key-checker и pt-index-usage, чтобы найти индексы, которые вам не нужны.
В других ответах сообщалось, что INSERT / UPDATE / DELETE медленнее, чем больше у вас индексов. Это правда, но учтите, что во многих случаях использования UPDATE и DELETE также есть предложения WHERE, а в MySQL UPDATE и DELETE также поддерживают JOIN. Индексы могут принести пользу этим запросам больше, чем компенсировать накладные расходы на обновление индексов.
Кроме того, InnoDB блокирует строки, затронутые операциями UPDATE или DELETE. Они называют это блокировкой на уровне строк, но на самом деле это блокировка на уровне индекса. Если нет индекса для сужения поиска, InnoDB должен заблокировать намного больше строк, чем конкретная строка, которую вы изменяете. Он может даже заблокировать все строки в таблице. Эти блокировки блокируют изменения, сделанные другими клиентами, даже если они не конфликтуют логически.
Если вы знаете, что вам нужно выполнить запрос, который выиграет от индексации в одном из вышеуказанных случаев.
Если индекс является левым префиксом другого существующего индекса или индекс не помогает ни одному из запросов, которые необходимо выполнить.
В некоторых случаях MySQL может выполнять оптимизацию слияния индексов. и либо , либо пересекать результаты независимого поиска по индексам. Но это дает лучшую производительность для определения одного индекса, поэтому слияние индексов не требуется.
Для одного из моих клиентов-консультантов я определил многостолбцовый индекс для таблицы "многие ко многим", где индекса не было, и улучшил их запрос на соединение в 94 миллиона раз!
Создание правильных индексов - сложный процесс, основанный на запросах, которые необходимо оптимизировать. . Не следует устанавливать общие правила, такие как «индексировать все» или «ничего не индексировать, чтобы не замедлять обновления».
См. Также мою презентацию « Как правильно разрабатывать индексы» .
источник
Индексы должны быть информированы о проблеме: таблицы, запросы, которые будет запускать ваше приложение, и т. Д.
ВЫБОР.
INSERT будет медленнее, потому что вам нужно обновить индекс.
Когда вашему приложению требуется еще одно предложение WHERE.
Когда вам не нужно запрашивать или применять ограничения уникальности.
Я не понимаю вопроса. Если у вас есть ограничение уникальности, которое включает несколько столбцов, обязательно моделируйте его как таковое.
источник
Да. Не выходить надеюсь создавать индексы, создавать их по мере необходимости.
Любые запросы к таблице / представлению индексов.
Любые операторы INSERT для индексированной таблицы будут замедлены, потому что каждая новая запись должна быть проиндексирована.
Когда запрос не выполняется с приемлемой скоростью. Вы можете фильтровать записи, которые не являются частью кластерного PK, и в этом случае вам следует добавить индексы на основе фильтров, которые вы ищете (если производительность сочтет нужным).
Когда вы делаете это ради этого - то есть чрезмерной оптимизации.
Зависит от запросов, которые вы пытаетесь улучшить.
источник
Да, как и все остальное, слишком много индексов замедлит манипуляции с данными.
Хорошая идея добавить индекс - это когда ваши запросы слишком медленные (т. Е. У вас слишком много соединений в ваших запросах). Эту оптимизацию следует использовать только после того, как вы построили твердую модель, чтобы настроить производительность.
источник