我正在 Python 中使用 Django 构建一个大型 Web 应用程序(我可能会切换到 Flask),并且我正在尝试优化获取数据的方式。具体来说,我正在争论对于具有复杂关系(例如嵌套数据、外键)的大型数据集的急切加载(预先获取所有数据)和延迟加载(按需获取数据)。
我的主要挑战是过度获取(预先检索太多数据)、N+1 查询问题(多个不必要的查询)、用户感知的延迟(加载数据的延迟)。这些方法之间的权衡是什么?我如何决定何时使用其中一种方法?在处理大量数据和实时更新的同时优化数据获取性能有什么建议吗?
TL;DR:对于具有复杂数据和实时更新的大型应用程序,您如何决定何时使用急切加载和延迟加载?
QuerySet
是惰性,这对于提高性能很有用,但可能更有用,因为您可以进一步过滤QuerySet
,对其进行分页等。
N+1查询问题
.prefetch_related(…)
[Django-doc] 来修复此问题,如果您评估 QuerySet
,它还会在一个额外查询中获取相关数据。如果关系更复杂,您甚至可以使用 Prefetch
对象[Django-doc]。
很多工具也没有充分利用
QuerySet
。例如,可以使用 .only(…)
[Django-doc] 仅检索某些列,从而最大限度地减少数据库和应用程序之间的带宽。