Что такое жадная загрузка (eager loading) в контексте работы с базой данных?

«Что такое жадная загрузка (eager loading) в контексте работы с базой данных?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Жадная загрузка (Eager Loading) — это стратегия загрузки связанных данных (например, записей из связанных таблиц) одним запросом на этапе загрузки основного объекта. Это противоположность ленивой загрузки (Lazy Loading), где связанные данные подгружаются отдельными запросами только при первом обращении к ним.

Классическая проблема N+1, которую решает eager loading:

// ЛЕНИВАЯ ЗАГРУЗКА (Проблема N+1)
$authors = Author::all(); // 1 запрос: SELECT * FROM authors

foreach ($authors as $author) {
    // Для каждого автора выполняется отдельный запрос:
    // SELECT * FROM books WHERE author_id = ?
    echo count($author->books); // N дополнительных запросов
}
// Итого: 1 + N запросов.

Решение через жадную загрузку (в Laravel Eloquent):

// ЖАДНАЯ ЗАГРУЗКА
$authors = Author::with('books')->get(); // 2 запроса:
// 1. SELECT * FROM authors
// 2. SELECT * FROM books WHERE author_id IN (1, 2, 3, ...)

foreach ($authors as $author) {
    // Данные книг уже загружены в память, новых запросов нет.
    echo count($author->books);
}
// Итого: 2 запроса независимо от числа авторов.

Когда использовать:

  • Когда вы заранее знаете, что связанные данные понадобятся для обработки коллекции.
  • Для предотвращения проблемы N+1 и значительного повышения производительности.

Когда не использовать:

  • Если связанные данные нужны лишь для少数 объектов.
  • Когда работаете с глубокими или сложными связями, чтобы не загружать лишние данные и не тратить память.