N+1 问题导致整个系统的性能下降
整个系统性能下降是 N+1 问题最明显的地方。
例如,在Web应用程序中,页面加载时间将显著增加,从而导致用户体验不佳。
此外,在基于 API 的系统中,缓慢的 API 响应时间也会对客户端应用程序产生负面影响。
糟糕的表现最终会影响您的底线和品牌形象。
解决 N+1 问题的通用方法
解决 N+1 问题的常用方法包括预加载相关数据和优化查询。
具体来说,Django 的 `select_related` 和 `prefetch_related`,以及 Rails 的 `includes` 方法很有用。
或者,您可以手动自定义查询以在单个查询中仅检索所需的数据。
通过适当结合这些技术,可以有效地避免N+1问题。
N+1
N+1 问题的主要原因是数据库查询效率低下以及 ORM 自动生成的查询的设计。
ORM 是抽象数据库操作的有用工具,但是当使用其默认设置时,它们通常会导致查询以单独检索每个相关数据。
这会增加与主要数据和相关数据量 英国电报数据 成比例的查询数量,从而增加数据库的负载。
当处理大量数据或检索多个相关数据时,这个问题变得尤为明显。
本节详细介绍了此问题的根本原因及其影响。
使用 ORM 时 N+1 问题的典型模式
使用 ORM 时出现的 N+1 问题的典型模式是检索一个主要数据,然后分别检索与该主要数据相关联的每个数据。
例如,在 Django 中,当获取博客文章(主要数据)及其作者信息(相关数据)时,可能会分别获取作者信息。
当开发人员没有正确使用“select_related”或“prefetch_related”时,经常会出现这种模式。
为了避免这个问题,您应该设计查询来一起检索相关数据。
检索主要数据和相关数据所需的查询数量增加
当出现N+1问题时,所需的查询次数会随着所涉及的数据量线性增加。
例如,如果您有 10 个主要数据项和 5 个相关数据项,则典型的设计将涉及一个查询来检索 10 个主要数据项,以及另外 50 个查询来检索相关数据项。
这导致总共发出 51 个查询,大大增加了数据库的负载。
在数据量较大的系统中,这种增长更为明显。