«Але ж там є індекс!» — типова фраза перед тим, як розробник дивиться на повільний запит. Індекс не гарантує швидкості: MySQL сам вирішує, чи користуватися ним. Розберемо найчастіші причини, чому індекс не працює, і як це перевірити.
Починайте з EXPLAIN
Перед будь-якою оптимізацією запустіть запит із EXPLAIN. Дивіться на три колонки.
- key — який індекс вибрано. NULL означає, що жодного.
- rows — скільки рядків база збирається прочитати.
- type — ALL означає повне сканування таблиці, ref чи range — уже непогано.
EXPLAIN SELECT * FROM orders WHERE user_id = 42 AND status = 'paid' ORDER BY created_at DESC LIMIT 20;
Причина 1: порядок колонок у складеному індексі
Індекс (status, user_id) не…