我对数据库相当缺乏经验,并且刚刚阅读了有关“n+1 选择问题”的信息。我的后续问题:假设数据库与我的程序位于同一台机器上,缓存在 RAM 中并正确索引,为什么 n+1 查询模式很慢?
作为一个例子,让我们从接受的答案中获取代码:
SELECT * FROM Cars;
/* for each car */
SELECT * FROM Wheel WHERE CarId = ?
根据我对数据库缓存的心智模型,每个SELECT * FROM Wheel WHERE CarId = ?
查询都应该需要:
- 1 次查找以到达“Wheel”表(一个 hashmap
get()
) - 1 次查找以到达具有指定
CarId
(另一个 hashmapget()
)的 k 个轮子列表 - k 查找以获取每个匹配车轮的车轮行(k 指针取消引用)
即使我们将它乘以一个小的常数因子以获得额外的开销,因为内部内存结构,它仍然应该快得不明显。进程间通信是瓶颈吗?
编辑:我刚刚通过 Hacker News 找到了这篇相关文章:通过 Postgres Internals 遵循 Select Statement。-HN讨论线程。
编辑2:为了澄清,我确实假设N
很大。那么,一个不平凡的开销将增加一个明显的延迟,是的。我在问为什么对于上述设置,开销首先不是微不足道的。