我回答了我自己的问题,希望它可以帮助别人。我正在使用mongodb(3.4),在索引字符串字段上运行count()
,在10m文档的集合中。我正在寻找非空字符串。以下是一些性能指标,其中slow == collection_scan和fast == index_scan:
+----------------+-----------+
| Constraint |Performance|
+----------------+-----------+
| $exists(false) | slow |
| $exists(true) | slow |
| $ne: '' | slow |
| $eq: '' | fast |
| $eq: null | slow |
+----------------+-----------+
我认为我基本上了解发生的事情,即:
1。 $存在(假)
不存在的字段不会进入索引,因此mongodb必须执行收集扫描才能收集count()
的所有文档。
2。 $存在(真)
这是让我的。我觉得它会很快,但我错了。我认为这是因为如果一个字段存在,并且它的值设置为undefined
,则$ exists()返回 true 。我只能假设设置为undefined的字段也不输入索引,因此mongodb必须再次执行集合扫描以收集count()的所有文档。
第3。 $ ne:''
我猜它与$ exists(false)相同
4。 $ eq:''
这是一个真正的字符串值,因此它必须存在于索引中,因此速度很快。
4。 $ eq:null
这是另一个让我受益的人。本文档有助于批次(https://jira.mongodb.org/browse/SERVER-18653)。简而言之,2.6版本(https://docs.mongodb.com/manual/release-notes/2.6-compatibility/#null-comparison-queries):
空等式查询(即field:null)现在匹配值为undefined
的字段
此查询很慢。我只能假设未定义的字段没有被索引,并且因为null匹配两者,mongodb必须再次执行集合扫描以收集count()的所有文档。
那么,做什么?
答案 0 :(得分:0)
<强>解决方案强>
我最终做的是使用正则表达式/^.+$/
来查找非空字符串。这使用索引并且速度超快。同样重要的是,我现在尽量避免使用$exists()
和$ne:
。
由于