В моем путешествии по MySQL и его расширенным функциям, особенно в отношении оптимизации производительности, я наткнулся на одну чрезвычайно важную функцию для повышения производительности SQL, которую многие из нас знают так же, как «Индекс».
Я продолжил эксперименты и обнаружил, что могу улучшить чтение моей базы данных и расширенные функции записи от 20 до 100 раз, просто применив дополнительный индекс к одному из наиболее часто используемых столбцов.
Естественно возникает вопрос: если такое улучшение производительности жизнеспособно, почему бы не настроить индексацию для каждого столбца базы данных и ускорить операции с базой данных от 2 до 100 раз?
Очевидно, есть причина, по которой этого не происходит по умолчанию.
Итак, как узнать, что и когда индексировать? Каковы ограничения индексирования и как это может повлиять на общую производительность моей системы, если я переусердствую с индексированием. Влияет ли индексирование на производительность чтения и записи моей базы данных при чрезмерном использовании?
Я использую InnoDB в качестве основного движка базы данных, в моей системе работают процессоры perl + apache + mysql: Intel (R) Xeon (R) CPU L5520 @ 2,27 ГГц RAM: 8192 МБ
Индексы занимают место, и если вы обновляете свои данные, индексы необходимо перестраивать, что требует времени.
Ваши индексы ускоряют поиск в таблицах. Не все операции!
Чтобы знать, какие индексы вам нужны, вам нужно понять свое приложение, а также немного о том, как работает СУБД.
Пример: Если у вас есть таблица с людьми в ней, и ваше приложение никогда не ищет людей с конкретным размером обуви, вам, скорее всего, не нужен указатель размера обуви.
В MySQL есть функция регистрации медленных запросов и запросов без использования индексов. Это может быть полезно для планирования индексации.
Естественно возникает вопрос: если такое улучшение производительности жизнеспособно, почему бы не настроить индексацию для каждого столбца базы данных и ускорить операции с базой данных от 2 до 100 раз?
Во-первых, индексирование помогает не во всех ситуациях. Если запросы написаны плохо, индекс не поможет. Индексы могут занимать довольно много места, часто во много раз больше, чем сами данные, поэтому добавление индекса для каждого столбца будет чрезвычайно расточительным.
Итак, как узнать, что и когда индексировать? Каковы ограничения индексирования и как это может повлиять на общую производительность моей системы, если я переусердствую с индексированием.
Ваши запросы определяют, какие данные необходимо проиндексировать. В EXPLAIN
Команда поможет вам понять, что нужно проиндексировать и насколько эффективно ваши индексы помогают выполнять ваши запросы.
Индексы не помогут плохим запросам. Например, такие запросы, как select * from table where col like "%stuff%"
или select * from table where col rlike "ing$"
Дополнительное индексирование не поможет. В таких случаях лучше настраивать запросы, чем выполнять индексацию.
Сначала настройте свои запросы. Использовать EXPLAIN
и следите за журналами на предмет медленных запросов. После того, как вы подтвердите, что запросы больше нельзя настраивать, начинайте добавлять индексы.
В дополнение ко всем вышеперечисленным советам, что является отличным, я хотел бы отметить, что любая таблица, в которой наблюдается много операций записи, будет проблематичной при индексировании, потому что процесс индексирования будет постоянно работать в высоком уровне, чтобы не отставать от изменений.