Індекси бази даних

07.01.2011
Database Indices
Автор:

Рано чи пізно кожен веб розробник наштовхується на ситуацією, коли сайт "падає" і його доводиться "піднімати. Причин цьому може бути безліч, в даному ж записі ми розглянемо застосування лише одного виду "ліків" для підвищення продуктивності Drupal - а саме ІНДЕКСИ.

Що таке індекси?

Індекси застосовують для швидкого пошуку рядків із вказаним значенням одного стовпця. Без індексу читання таблиці здійснюється по всій таблиці, починаючи з першого запису, поки не будуть знайдені відповідні рядки. Чим більше таблиця, тим більшими є накладні витрати. Якщо ж таблиця містить індекс по стовпцях, котрі розглядаються, то MySQL може швидко визначити позицію для пошуку в середині файлу даних без перегляду всіх даних. Для таблиці, яка містить 1000 рядків, це буде як мінімум у 100 разів швидше в порівнянні з послідовним перебором всіх записів. Проте, у випадку, коли потрібен доступ майже до всіх 1000 рядків, швидшим буде послідовне читання, так як при цьому не буде потреби виконання операцій пошуку по диску (джерело).

Розглянемо, скориставшись дуже простим прикладом. Припустимо, в нас є ось така вюшка:

яка згенерувала такий запит:

SELECT users.uid AS uid, users.name AS users_name, users.created AS users_created FROM users users ORDER BY users_created DESC

Для розгляду намірено вибрано спрощений варіант, аби було простіше розібратися в базисі.

При такому досить таки нескладному запиті база даних звернеться до необхідної таблиці, візьме дані, відсортує їх як зазначено в запиті і видасть результат.

І так буде повторюватися щоразу, коли запит викликається.

Створюємо індекс:

CREATE INDEX my_user_created ON users (users_created, users_name,users.uid));

Система створить типу "копію таблиці", в якій дані будуть вказані у послідовності "users_created, users_name, users.uid".  Тепер при виконанні запиту системі не треба буде сортувати дані - вона просто видаватиме вміст індексу.

У випадку запиту:

SELECT users.uid AS uid, users.name AS users_name, users.created AS users_created FROM users users WHERE uid BETWEEN 1 AND 12 ORDER BY users_created DESC

треба створювати індекс:

CREATE INDEX my_user_uid ON users (users.uid, users_created,users_name));

У цьому випадку, при виконанні запиту, системі не доведеться перебирати всю таблицю, адже в індексі вже знаходяться впорядковані дані. Відповідно буде просто вирізано частину індексної таблиці і видано як результат.

2 votes, Рейтинг: 4

Також по темі

1

Засновники та розробники MySQL пішли з рідної компанії, яка належить Oracle (колись Sun поглинула MySQL AB, а потім Oracle поглинула Sun).

Subscribe to our blog updates