我正在运行这种类型的大量查询:
db.mycollection.find({a:{$gt:10,$lt:100}, b:4}).sort({c:-1, a:-1})
Run Code Online (Sandbox Code Playgroud)
我应该使用什么样的索引加快速度?我想我会需要有既{a:1, b:1}和{c:-1, a:-1},是吗?或者这些索引会以某种方式相互干扰而不会增加性能?
编辑:我的实际问题是我在一个循环中运行了很多查询,其中一些在小范围内,另一些在大范围内.如果我打开索引{a:1, b:1},它会非常快速地选择小块,但是当涉及到大范围时,我会看到错误"没有索引的sort()数据太多".如果,否则,我将索引打开{c:-1, a:-1},没有错误,但较小的块(以及更多的那些)处理得慢得多.那么,如何保持较小范围的选择速度,但不能在大量数据上获得错误?
如果重要,我通过Python的pymongo运行查询.
如果您阅读过文档,您会发现这里使用两个索引是没有用的,因为 MongoDB 每个查询仅使用一个索引(除非它是$or),直到:https ://jira.mongodb.org/browse/SERVER-3071已实施。
不仅如此,当使用复合排序时,索引中的顺序必须与要正确使用索引的排序顺序相匹配,如下所示:
或者这些索引会以某种方式相互干扰而不会提高性能?
如果没有实现交集,则它们不会,与{a:1,b:1}排序不匹配,并且{c:-1,a:-1}对于回答加find()号a不是该复合词的前缀而言不是最佳选择。
因此,最佳索引的迭代立即将是:
{a:-1,b:1,c:-1}
Run Code Online (Sandbox Code Playgroud)
但这还不是故事的全部。由于$gt和$lt实际上是范围,就像$in它们在索引方面遇到同样的问题一样,本文应该提供答案:http://blog.mongolab.com/2012/06/cardinal-ins/并没有真正看到任何理由重复它内容。
| 归档时间: |
|
| 查看次数: |
3369 次 |
| 最近记录: |