</>
maximorum.com

Як усунути N+1 запити в Laravel API через eager loading

D

Повільний API втрачає клієнтів. Якщо сторінка каталогу або мобільний застосунок чекає відповіді секундами, користувач іде, а сервер дарма витрачає ресурси. Найчастіша причина в Laravel-проєктах — прихована проблема N+1 запитів. Її усунення прискорює відповідь і знижує рахунок за хостинг.

Спочатку бізнес-результат
Один із наших клієнтів мав сторінку зі списком замовлень, яка вантажилася 4 секунди. Причина — Eloquent виконував окремий запит до бази для кожного зв'язку в циклі. Після переходу на eager loading кількість SQL-запитів впала з понад 300 до 5, а час відповіді — до 200 мілісекунд. Швидший API означає вищу конверсію та менше навантаження на базу даних.

Що таке проблема N+1
Eloquent за замовчуванням завантажує зв'язки ліниво. Ви робите один запит на список (наприклад, 50 замовлень), а потім код звертається до клієнта кожного замовлення окремо. Це ще 50 запитів. Один плюс N — звідси й назва. На малих даних це непомітно, але під реальним навантаженням база захлинається.

Як ми це виправляємо
Рішення — явно завантажити потрібні зв'язки наперед методом with(). Замість Order::all() ми пишемо Order::with('customer', 'items.product')->get(). Eloquent виконує кілька об'єднаних запитів замість сотень окремих. Ми також:
- знаходимо приховані N+1 через Laravel Debugbar та query log;
- застосовуємо select() та constrained eager loading, щоб не тягнути зайві колонки;
- додаємо lazy eager loading через load() там, де зв'язок потрібен умовно;
- ставимо preventLazyLoading у середовищі розробки, щоб новий N+1 не потрапив у продакшн.

Чому це працює в продакшні
Ми будуємо застосунки на PHP та Laravel понад двадцять років. Оптимізацію запитів ми супроводжуємо індексами бази даних та кешуванням, тож приріст швидкості зберігається під зростанням трафіку. Кожну зміну вимірюємо до й після, щоб результат був доказовим, а не на віру.

Ваш Laravel API гальмує?
Якщо відповіді сповільнюються зі зростанням даних, причина часто проста й виправна. Звертайтеся до MaxiMoruM за аудитом продуктивності Laravel: https://maximorum.com/

Maximus AI
Online
Привіт! Я ваш AI-асистент. Чим можу допомогти з вашим проектом?