N+1查询问题的常见迹象包括以下详细指标:
- 查询数量过多:最明显的符号是您的应用程序执行比预期更多的数据库查询。通常,您会看到一个初始查询以获取记录列表,然后对每个记录进行附加查询以获取相关数据。例如,获取10个用户,然后运行10个单独的查询以获取每个用户的帖子会产生11个查询,而不仅仅是一个优化的查询[1] [3]。
- 慢缓慢的应用程序响应时间:由于每个查询都需要往返数据库,因此许多小查询的累积效应显着减慢了数据检索。这导致页面加载或API响应较慢,使应用程序对用户请求的响应较低[1] [5]。
- 高数据库负载:由于查询数量大量,数据库服务器的负载增加了负载,这些查询可能会损害资源并减少系统的整体吞吐量。随着用户或数据的增加[3] [5] [6],这会降低性能并限制可伸缩性。
- 在慢速查询日志中看不见:与单个慢速查询不同,n+1问题通常在慢速查询日志中忽略,因为每个单独的查询都很快运行。但是,许多查询的总效应会导致性能降解[2]。
- ORM触发的意外或隐藏的查询:使用对象关联映射(ORM)框架时,n+1问题通常是由于懒惰的加载或配置错误而引起的。循环中访问相关的实体可以触发其他查询,而无需在代码中明确呼叫,从而仅通过查看源代码[2] [5] [6]就很难检测到。
- 数据获取模式中的性能瓶颈:如果您的应用程序具有复杂的对象关系并以多个步骤获取相关数据,而不是在单个优化查询中获取相关数据,则此模式是N+1问题的强烈指示[6]。
总而言之,常见的迹象是由于多个数据库圆旅行,增加数据库服务器上的负载增加而导致的简单数据检索,响应时间缓慢的数据库查询数量出乎意料,并且很难发现问题,因为每个查询都会单独执行迅速但共同导致延迟。这些症状在使用具有默认懒惰加载行为的ORM的应用中尤其普遍[1] [2] [3] [5] [6] [7]。
引用:
[1] https://planetscale.com/blog/what-is-n-1-query-problem-and-problem-and-and-how-to-solve-it
[2] https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problems-problem-in-orm-object-rational-Real-Mappation
[3] https://www.pingcap.com/article/how-to-solficely-solve-the-n1-query-problem//
[4] https://evnedev.com/blog/development/the-n1-query-problem-what-is-it-is-is-and-how-do-you-solve-it/
[5] https://digma.ai/n1-query-problem-and-how-to-detect-it/
[6] https://www.neurelo.com/post/what-is-the-n-1-query-problem
[7] https://dev.to/lovestaco/the-n1-query-problem-the-silent-performance-killer-2b1c
[8] https://www.pullrequest.com/blog/avoiding-n-1-database-queries-queries-in-asp-net-a-practical-guide/