MySQL Індекс: Посібник зі створення, додавання та видалення
⚡ Розумний підсумок
MySQL У посібнику з індексування розглядається, як індекси сортують та швидко знаходять дані. Індекс – це відсортована структура пошуку, створена для одного або кількох стовпців; CREATE INDEX додає його, SHOW INDEXES перевіряє його, а DROP INDEX видаляє його, коли таблиці з великим обсягом запису переважають переваги читання.

Що таке? MySQL Індекс?
An індекс in MySQL — це структура даних, яка зберігає значення стовпців упорядковано, щоб пошуковий механізм міг швидко шукати рядки. Індекси створюються для стовпця або стовпців, які найчастіше використовуються для фільтрації даних. Уявіть собі індекс як список, відсортований в алфавітному порядку: набагато швидше знайти ім'я в відсортованому списку, ніж у несортованій купі.
Індекси мають певний компроміс — кожна операція INSERT або UPDATE має підтримувати індекс, тому додавання занадто великої кількості індексів до таблиці з великим обсягом запису може негативно вплинути на загальну продуктивність. Як правило, індексуйте стовпці, які з'являються в реченнях WHERE, JOIN та ORDER BY у таблицях, які зчитуються частіше, ніж записуються.
Навіщо використовувати індекс?
Ніхто не любить повільні системи. Висока продуктивність є головним пріоритетом майже для кожної програми, що базується на базах даних. Компанії витрачають значні кошти на обладнання для забезпечення швидкості запитів, але існує межа того, що може забезпечити саме лише обладнання. Оптимізація індексів — це дешевший та ефективніший важіль.
Повільний час відгуку зазвичай пов'язаний із тим, що рядки зберігаються на диску у фізичному порядку. Без індексу, MySQL повинен просканувати кожен рядок, щоб знайти ті, що відповідають предикату — «повне сканування таблиці». Індекси дозволяють MySQL перейти безпосередньо до відповідних рядків, що перетворює план запиту з O(n) приблизно на O(log n) для пошуку в B-дереві.
Синтаксис: створити індекс
Індекс можна визначити у двох місцях:
- Під час створення таблиці.
- Після того, як таблиця вже існує.
Приклад: Створення індексу всередині за допомогою CREATE TABLE
Для myflixdb У базі даних ми очікуємо багато пошуків у стовпці повного імені. Наведений нижче скрипт створює новий members_indexed таблиця з індексом на full_names .
CREATE TABLE `members_indexed` (
`membership_number` INT(11) NOT NULL AUTO_INCREMENT,
`full_names` VARCHAR(150) DEFAULT NULL,
`gender` VARCHAR(6) DEFAULT NULL,
`date_of_birth` DATE DEFAULT NULL,
`physical_address` VARCHAR(255) DEFAULT NULL,
`postal_address` VARCHAR(255) DEFAULT NULL,
`contact_number` VARCHAR(75) DEFAULT NULL,
`email` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`membership_number`),
INDEX (`full_names`)
) ENGINE = InnoDB;
Виконайте скрипт у MySQL Верстак проти myflixdb , що постійно розширюється.
оновлення myflixdb побачити нове members_indexed таблиці. Файл full_names тепер колонка відображається під Індекси вузол.
Зі зростанням кількості учасників, пошукові запити на members_indexed що використовують WHERE та ORDER BY для full_names набагато швидші, ніж ті ж запити в оригіналі members таблиця без індексу.
Додати індекс після того, як таблиця вже існує
Ви часто виявляєте, що існуючій таблиці потрібен індекс — пошукові запити виконуються повільно, а план EXPLAIN показує повне сканування таблиці для стовпця, який відображається в WHERE. CREATE INDEX Оператор додає індекс без повторного створення таблиці.
CREATE INDEX `id_index` ON `table_name` (`column_name`);
Конкретний приклад — пришвидшення пошуку на title стовпець movies стіл:
CREATE INDEX `title_index` ON `movies` (`title`);
Кожен запит, який фільтрується за movies.title тепер підтримується новим індексом. Запити, які фільтрують інші стовпці, все одно сканують таблицю, якщо вони не мають власного індексу.
Примітка: Ви можете створити складений індекс для кількох стовпців, коли ваші запити завжди фільтрують або сортують за однією й тією ж комбінацією. Порядок має значення — провідний стовпець визначає, чи можна використовувати індекс.
Список індексів у таблиці
Скористайтеся кнопкою SHOW INDEXES щоб побачити кожен індекс, визначений у таблиці.
SHOW INDEXES FROM `table_name`;
Приклад — список індексів на movies стіл:
SHOW INDEXES FROM `movies`;
Виконайте оператор у MySQL Верстак проти myflixdb щоб побачити існуючі індекси та стовпці, які вони охоплюють.
Примітка: Первинні та зовнішні ключі індексуються автоматично MySQLКожен індекс має унікальну назву та містить список стовпців, які він охоплює.
Синтаксис: Видалити індекс
Скористайтеся кнопкою DROP INDEX видалити існуючий індекс з таблиці. Це корисно, коли таблиця з інтенсивним записом уповільнюється індексом, який більше не заробляє на собі гідність на стороні читання.
DROP INDEX `index_id` ON `table_name`;
Конкретний приклад — відкиньте full_names індекс з members_indexed:
DROP INDEX `full_names` ON `members_indexed`;
Види MySQL Індекси
MySQL підтримує кілька типів індексів, кожен з яких підходить для різного робочого навантаження.
| тип | Мета |
|---|---|
| PRIMARY KEY | Унікальний ідентифікатор рядка; кластеризований з даними таблиці в InnoDB. |
| UNIQUE | Забезпечує унікальність, водночас виконуючи роль індексу. |
| ІНДЕКС (B-дерево) | Вторинний індекс за замовчуванням, який використовується для запитів діапазону та пошуку рівності. |
| ПОВНИЙ ТЕКСТ | Оптимізовано для пошуку тексту природною мовою за допомогою MATCH … AGAINST. |
| ПРОСТОРОВИЙ | Індекс R-дерева для типів даних ГІС, таких як ТОЧКА та ПОЛІГОН. |
| ХАШ | Пошук рівності за постійний час; використовується механізмом зберігання MEMORY. |
| Композитний (багатоколонковий) | Об'єднує кілька стовпців в один індекс; дотримується правила префікса крайнього лівого рядка. |
Найкращі практики для MySQL Індекси
Наведені нижче звички забезпечують корисність індексів та запобігають їх перетворенню на мертвий вантаж.
- Індекс шаблону запиту, а не назви стовпця: додайте індекси, що відповідають реальним реченням WHERE, JOIN та ORDER BY, а не «кожному стовпцю, який здається важливим».
- Порядок спостереження за складеним індексом: Для використання індексу в запиті має бути присутній початковий стовпець.
- Уникайте дублікатів індексів: Провідний префікс складеного індексу вже охоплює пошук в одному стовпці за цим префіксом.
- Перевірте за допомогою ПОЯСНЕННЯ: підтвердити, що планувальник фактично вибирає новий індекс.
- Видалити невикористані індекси: використання
sys.schema_unused_indexesin MySQL 5.7+ для пошуку індексів, які нічого не зчитує. - Типи даних відповідності: Якщо речення WHERE порівнює стовпець VARCHAR з числом, індекс не може бути використаний через неявне приведення типів.


