Індекси можуть зіграти важливу роль в оптимізації запитів та швидкому пошуку результатів з таблиць. Отже, найважливішим кроком є вибір стовпців для індексації. Існує два основних місця, де ми можемо розглянути індексацію: стовпці, на які посилається речення 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 */
Оскільки на посилання "customer_id" посилається в частині 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 із таблиці country, може бути розглянуто для індексації, оскільки воно знаходиться в реченні JOIN. Отже, індексацію можна розглядати в кожному полі речення WHERE або речення JOIN.
У наведеному нижче списку також пропонується кілька порад, про які слід завжди пам’ятати, коли маєте намір створювати індекси у своїх таблицях:
- Індексуйте лише ті стовпці, які потрібні в реченнях WHERE та ORDER BY. Індексування ряду стовпців призведе до деяких недоліків.
- Спробуйте скористатися функцією "префікс індексу" або "індекс багатостолбців" MySQL. Якщо ви створюєте індекс, такий як INDEX (ім'я, прізвище), не створюйте INDEX (ім'я). Однак "префікс індексу" або "індекс із кількома стовпцями" не рекомендується застосовувати у всіх випадках пошуку.
- Використовуйте атрибут NOT NULL для тих стовпців, у яких ви розглядаєте індексацію, щоб значення NULL ніколи не зберігалися.
- Використовуйте параметр --log-long-format для реєстрації запитів, які не використовують індекси. Таким чином, ви можете перевірити цей файл журналу та відповідно налаштувати свої запити.
- Оператор EXPLAIN допомагає виявити, як MySQL буде виконувати запит. Він показує, як і в якому порядку об’єднуються таблиці. Це може бути дуже корисним для визначення способу написання оптимізованих запитів та необхідності індексації стовпців.
Оновлення (23 лютого 2015 р.):
Будь-який індекс (хороший / поганий) збільшує час вставки та оновлення.
Залежно від ваших індексів (кількості індексів та типу) здійснюється пошук результатів. Якщо час пошуку збільшиться через індекс, то це поганий індекс.
Напевно, в будь-якій книзі "Індексна сторінка" може мати початкову сторінку глави, починається номер сторінки теми, а також починається сторінка підтеми. Деякі роз’яснення на сторінці «Індекс» допомагають, але більш детальний покажчик може вас спантеличити або злякати. Індекси також мають пам’ять.
Вибір індексу повинен бути розумним. Майте на увазі, не для всіх стовпців потрібен індекс.