Индексы могут играть важную роль в оптимизации запросов и быстром поиске результатов по таблицам. Так что это самый важный шаг, чтобы выбрать, какие столбцы будут индексироваться. Есть два основных места, где мы можем рассмотреть индексацию: столбцы, на которые есть ссылка в предложении WHERE, и столбцы, используемые в предложениях JOIN. Короче говоря, такие столбцы должны быть проиндексированы, по которым вы должны искать конкретные записи. Предположим, у нас есть таблица с именем покупателей, где запрос 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 есть ссылка на customer_id, 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 февраля 15):
Любой индекс (хороший / плохой) увеличивает время вставки и обновления.
В зависимости от ваших индексов (количество индексов и тип), результат ищется. Если ваше время поиска увеличится из-за индекса, то это плохой индекс.
Вероятно, в любой книге "Страница указателя" может иметь начальную страницу главы, начинается номер страницы темы, а также страница подтемы. Некоторое разъяснение на странице указателя помогает, но более подробный указатель может сбить вас с толку или напугать. Индексы также имеют память.
Выбор индекса должен быть мудрым. Имейте в виду, что не для всех столбцов требуется индекс.