Оптимізація запитів mysql - використання індексів - альтернатива order by - приклади на perl

MySQL своєму розпорядженні великий набір функцій для різних угруповань (ORDER BY), угруповань (GROUP BY), об'єднань (LEFT JOIN або RIGHT JOIN) і так далі. Всі вони безумовно зручні, але в умовах одноразових запитів. Наприклад, якщо особисто Вам потрібно щось відкопати в базі використовуючи купу таблиць і зв'язок, то крім перерахованих вище функцій можна і навіть потрібно застосовувати умовний оператори IF. Головна помилка початківців програмістів це прагнення застосувати такі запити в робочому коді сайту. В даному випадку складний запит безумовно гарний, але шкідливий. Вся справа в тому, що будь-які оператори угруповань, угруповань, об'єднань або вкладених запитів, не можуть виконуватися в оперативній пам'яті, і використовують жорсткий диск для створення тимчасових таблиць. А хард, як відомо - найвужче місце сервера.

Правила оптимізації mysql запитів

1. Уникайте вкладених запитів

Це найсерйозніша помилка. Батьківський процес завжди буде чекати завершення дочірнього і в цей час тримати коннект до бази, використовувати диск і навантажувати iowait. Два паралельних запиту в базу і виконання потрібних фильтраций в серверному інтерпретаторі (Perl. PHP і т. Д.), Виконуватися на порядок швидше ніж вкладений.

Приклади на perl. як робити не слід:

або не в якому разі ось так:

Якщо є необхідність подібних дій, у всіх випадках краще використовувати хеш, масив або будь-який інший шлях для фільтрації.

Приклад на perl, як роблю зазвичай я:

2. Не сортуйте, що не гуртуйте і не фільтруйте в базі

По можливості не застосовуйте в своїх запитах оператори ORDER BY, GROUP BY, JOIN. Всі вони використовують тимчасові таблиці. Якщо сортування або угруповання необхідна тільки для виведення елементів, наприклад за алфавітом, краще виконати ці дії в змінних інтерпретатора.

Приклади на perl, як сортувати годі було:

Приклад на perl, як сортую зазвичай я:

Так набагато швидше. Особливо помітна різниця якщо даних багато. У разі, якщо потрібно впорядкувати в perl по декількох полях, можна застосувати сортування Шварца. Якщо потрібно довільна сортування ORDER BY RAND () - використовуйте сортування random в perl.

3. Використовуйте індекси

Якщо від сортування в базі можна відмовитися в деяких випадках, то від WHERE навряд чи вдасться. Тому, для полів, за якими буде йти порівняння, необхідно встановлювати індекси. Робляться вони просто.

Де 255 - довжина ключа. Для деяких типів даних він не потрібний. Подробиці в документації до MySQL.