Общее правило заключается в том, что чем больше у вас индексов в таблице, тем медленнее будут операции INSERT, UPDATE и DELETE.
Индексы в MySQL (или любой другой базе данных) не являются статичными. Каждый раз, когда мы обновляем таблицу (например, используя запрос INSERT), соответствующие индексы обновляются MySQL. Иначе они будут бесполезны в следующем поисковом запросе, который им понадобится.
Следовательно, добавление индексов не следует воспринимать легкомысленно, так как на самом деле это компромисс производительности, который должен быть правильно сбалансирован. Чем больше индексов вы добавите в набор столбцов/таблиц, тем медленнее будут операторы INSERT, UPDATE и DELETE. С другой стороны, поисковые операции будут оптимизированы с использованием этих индексов.
Эта статья не будет описывать методологии выбора правильных индексов, но подскажет, как найти и удалить избыточные индексы из вашей базы данных MySQL.
Начиная с MySQL 5.6, база данных отслеживает использование индекса как часть своей PERFORMANCE SCHEMA. Эти данные могут быть запрошены с использованием представления schema_unused_indexes, которое отображает индексы, для которых нет событий. Отсутствие событий означает, что эти индексы могут быть избыточными и некоторое время не использоваться.
Но жизнь не так хороша, по крайней мере, пока. Здесь потенциальным препятствием является то, что эта информация пересчитывается при каждом перезапуске MySQL. Поэтому, чтобы получить достоверную информацию, вы должны запросить эти представления через некоторое время после запуска экземпляра MySQL. Как долго после запуска вы спрашиваете? Ну, это зависит. Мой вопрос к вам будет – насколько занята ваша база данных? Знаете ли вы, все ли типы запросов обычно выполняются в базе данных за определенный период времени? Если это так, это ваше окно.
Итак, давайте посмотрим, как это делается:
select * from sys.schema_unused_indexes;
object_schema | object_name | index_name |
mydb | age | agecountry_index |
mydb | country | agecountry_index |
2 ряда в наборе (0,01 с)
Удаление неиспользуемого индекса так же просто, как выполнение этой команды:
DROP INDEX `index_name` on table
Итак, мы узнали, как отследить те неиспользуемые индексы, которые замедляют работу вашей базы данных. Кроме того, мы взглянули на то, как их удалить. Итак, начните оптимизировать эту базу данных!