Eager vs Lazy Loading: Лучшие стратегии получения данных для крупномасштабных веб-приложений?
Я создаю крупномасштабное веб-приложение с Django на Python (возможно, я перейду на Flask) и пытаюсь оптимизировать процесс получения данных. В частности, я размышляю между eager loading (получение всех данных заранее) и lazy loading (получение данных по требованию) для больших наборов данных со сложными отношениями (например, вложенные данные, внешние ключи).
Моими основными проблемами являются избыточная выборка (получение слишком большого количества данных заранее), проблема N+1 запросов (множество ненужных запросов), воспринимаемая пользователем задержка (задержки при загрузке данных). Каковы компромиссы между этими подходами, и как я могу решить, когда использовать один из них, а когда другой? Любые советы по оптимизации получения данных для повышения производительности при работе с большими объемами и обновлениями в реальном времени?
TL;DR: Как решить, когда использовать eager vs lazy loading для крупномасштабных приложений со сложными данными и обновлениями в реальном времени?
QuerySet
являются ленивыми, что полезно для повышения производительности, но, вероятно, даже больше, потому что вы можете дополнительно фильтровать QuerySet
, помещать его в пагинацию и т.д.
Проблема N+1 запроса
You can fix this by using .prefetch_related(…)
[Django-doc] which will, if you evaluate the QuerySet
, also fetch the related data in one extra query. If the relations are more complex, you can even use a Prefetch
object [Django-doc].
A lot of tooling also does not use the QuerySet
s to the full extent. For example one can use .only(…)
[Django-doc] to only retrieve certain columns minimizing bandwidth between the database and the application.