在意识到应用程序因 ORM 而遭受 N+1 问题后,我想了解更多有关可以执行的改进的信息以及与改进之前相比的时间统计(与 N+1 问题) 之后。
那么这种改进之前和之后的时间差是多少?
任何人都可以给我一个分析问题并检索统计数据的论文的链接吗?
最佳答案
你真的不需要统计数据,只需要数学。 N+1(或更好的1+N)代表
- 1 个查询来获取一条记录,并且
- N 个查询来获取与其关联的所有记录
N 越大,对性能的影响就越大,特别是当您的查询通过网络发送到远程数据库时。这就是为什么 N+1 问题在生产中不断出现 - 它们通常在开发模式下微不足道,数据库中的数据很少,但随着生产中的数据增长到数千或数百万行,您的查询将慢慢阻塞您的服务器。
您可以使用
- 单个查询(通过联接)或
- 2 个查询(一个针对主记录,一个针对所有关联记录
第一个查询将返回比严格需要的更多的数据(第一条记录的数据将在每行中重复),但这通常是一个很好的权衡。对于大型数据集,第二个查询可能会有点麻烦,因为所有外键都作为单个范围传入,但同样,这通常是值得做出的权衡。
实际数字取决于太多变量,统计数据没有意义。数量或记录、数据库版本、硬件等。
既然你用rails标记了这个问题,如果你知道如何使用ActiveRecord,它可以很好地避免N+1查询。查看eager loading的解释.
关于ruby-on-rails - Rails : N+1 problem. ..需要统计数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6723101/