Индексы могут играть важную роль в оптимизации запросов и быстром поиске результатов из таблиц. Поэтому наиболее важным шагом является выбор столбцов для индексации. Есть два основных места, где мы можем рассмотреть возможность индексирования: столбцы, указанные в предложении WHERE, и столбцы, используемые в предложениях JOIN. Короче говоря, должны быть проиндексированы такие столбцы, по которым вы должны искать определенные записи. Предположим, у нас есть таблица с именем Buyers, в которой запрос SELECT использует индексы, как показано ниже:
SELECT
buyer_id /* no need to index */
FROM buyers
WHERE first_name='Tariq' /* consider to use index */
AND last_name='Iqbal' /* consider to use index */
Так как "идентификатор покупателя" упоминается в части SELECT, MySQL не будет использовать его для ограничения выбранных строк. Следовательно, нет особой необходимости его индексировать. Ниже приведен еще один пример, немного отличающийся от приведенного выше:
SELECT
buyers.buyer_id, /* no need to index */
country.name /* no need to index */
FROM buyers LEFT JOIN country
ON buyers.country_id=country.country_id /* consider to use index */
WHERE
first_name='Tariq' /* consider to use index */
AND
last_name='Iqbal' /* consider to use index */
Согласно приведенным выше запросам столбцы first_name, last_name могут быть проиндексированы, поскольку они расположены в предложении WHERE. Также для индексации можно рассмотреть дополнительное поле country_id из таблицы стран, поскольку оно находится в предложении JOIN. Таким образом, индексацию можно рассматривать для каждого поля в предложении WHERE или JOIN.
В следующем списке также есть несколько советов, которые вы всегда должны иметь в виду, когда собираетесь создавать индексы в своих таблицах:
- Индексируйте только те столбцы, которые требуются в предложениях WHERE и ORDER BY. Обильная индексация столбцов приведет к некоторым недостаткам.
- Попробуйте воспользоваться функцией MySQL «индексный префикс» или «многостолбцовый индекс». Если вы создаете индекс, такой как INDEX (first_name, last_name), не создавайте INDEX (first_name). Однако использование «префикса индекса» или «индекса с несколькими столбцами» не рекомендуется во всех случаях поиска.
- Используйте атрибут NOT NULL для тех столбцов, в которых вы рассматриваете индексацию, чтобы значения NULL никогда не сохранялись.
- Используйте параметр --log-long-format для регистрации запросов, не использующих индексы. Таким образом, вы можете изучить этот файл журнала и соответствующим образом скорректировать свои запросы.
- Оператор EXPLAIN помогает вам понять, как MySQL будет выполнять запрос. Он показывает, как и в каком порядке объединяются таблицы. Это может быть очень полезно для определения того, как писать оптимизированные запросы и нужно ли индексировать столбцы.
Обновление (23 февраля 2015 г.):
Любой индекс (хороший / плохой) увеличивает время вставки и обновления.
В зависимости от ваших индексов (количества индексов и типа) ищется результат. Если ваше время поиска увеличится из-за индекса, то это плохой индекс.
Вероятно, в любой книге «Индексная страница» может иметь начальную страницу главы, начало номера страницы темы, а также начало страницы подтемы. Некоторое пояснение на странице указателя помогает, но более подробный указатель может вас смутить или напугать. У индексов тоже есть память.
Выбор индекса должен быть разумным. Имейте в виду, что не для всех столбцов требуется индекс.