Оптимізація запитів 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.