tgoop.com/phpproglib/5133
Last Update:
Оптимизированная ленивая загрузка в Symfony Doctrine для повышения производительности
Во время работы над проектом Symfony возникла проблема с производительностью из-за неожиданного поведения Doctrine. В одной из сущностей была настроена связь OneToOne с параметром fetch="LAZY»
, чтобы загружать связанные данные только при необходимости. Однако Doctrine загружал связанные сущности заранее, что приводило к избыточной нагрузке.
Проблема
Пример: сущность Store
имела связь OneToOne с сущностью StoreDetail
, содержащей метаданные о магазине. Даже при включённой ленивой загрузке Doctrine автоматически добавлял JOIN, что влияло на производительность:
Усложнённые запросы: ненужные операции JOIN увеличивали нагрузку на базу данных.
Избыточное использование памяти: данные загружались в память даже при их ненужности.
Замедление работы API: запросы, возвращающие списки магазинов, замедлялись из-за лишних данных.
Решение
1. Перепроектирование связи
Связь была преобразована из OneToOne в ManyToOne. Теперь StoreDetail
ссылался на Store
, что позволило Doctrine корректно применять ленивую загрузку.
2. Обновление схемы базы данных
С помощью Doctrine Migrations была изменена структура базы данных: старый внешний ключ для связи OneToOne был удалён, и добавлен ключ для ManyToOne.
3. Корректировка запросов
Теперь детали магазина загружаются только по необходимости
4. Профилирование
С помощью инструментов Symfony была подтверждена оптимизация. Теперь связанные сущности не загружаются без явного запроса.
Результаты
🟢Скорость выполнения запросов: уменьшилась в среднем на 35%.
🟢Использование памяти: значительно сократилось, так как избыточные данные больше не загружаются.
🟢Время ответа API: улучшилось на 20–30% для запросов с большими объёмами данных.
👉Ссылка на Medium
BY Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter
Share with your friend now:
tgoop.com/phpproglib/5133