【发布时间】:2012-03-22 09:33:25
【问题描述】:
我有一个在四个字段上按顺序排列复合索引的集合:(A,B,C,D)
当我像这样查询时
find({A: val1, B: val2, C: val3}).sort({D: 1}).limit(N)
在字段 A、B、C 中使用严格等于,它运行得非常快,应该是这样。 explain() 告诉我只扫描了 N 个文档。
如果我将 equals 之一更改为 $in 运算符(数组中有大约 100 个元素),它会扫描更多数量的文档并且运行速度更慢:
find({A: {$in: [val0, val1, ...]}, B: val2, C: val3}).sort({D: 1}).limit(N)
$or 等其他运算符具有相同的效果。
逻辑上,一个包含 100 个元素的 $in 必须与 100 个严格等于的单独查询非常相似。第二个变体在数据库中运行得更快,但需要在客户端通过后排序和限制获取所有元素(无限制)。
将这个带有$in 的查询拆分成几个带有equals 的查询以减少游标扫描的文档数量是否有意义?如果集合中有数百万个文档,什么会更有效率?
【问题讨论】: