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

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

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

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

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

Ответ 1

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

Поиск данных - инструкции SELECT.

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

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

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

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

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

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

Pro и Con из нескольких индексов и индексов с несколькими столбцами?

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

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

WHERE DATE(datetime_column) = ...

Ответ 2

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

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

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

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

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

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

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

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

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

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

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

Pro и Con из нескольких индексов и индексов с несколькими столбцами?

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

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

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

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

Ответ 3

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

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

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

Выделяет.

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

ВСТАВКИ будут медленнее, потому что вам нужно обновить индекс.

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

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

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

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

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

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

Ответ 4

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

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

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

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

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

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

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

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

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

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

Pro и Con из нескольких индексов и индексов с несколькими столбцами?

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

Ответ 5

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

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

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

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