我通过精彩的pouchdb-find在CouchDB 2.0实例上玩Mango查询。
有几次我收到了可怕的no matching index found, create an index to optimize query time
警告,即使我使用索引字段 。
刚才我在选择"type": {"$in": ["a", "b"]}
或等效"$or": [{"type": "a"}, {"type": "b"}]
时得到了它,即使type
上的索引存在。
谷歌搜索(cloudant query docs,pouchdb-find docs,SO question)没有帮助,后者@nlawson在上述问题中说了一些谓词($ne
,但也许我的$in
/ $or
属于同一个篮子?)"目前不使用任何索引" 。
谢谢!
答案 0 :(得分:6)
回答我的问题:不,$in
/ or
查询无法使用索引。我在this user@couchdb mailing list thread询问了问题,Garren Smith回答并指出了Understanding Mango View-Based Indexes vs. Search-Based Indexes和A look under the covers of PouchDB-find。引用加伦的话,
添加
"_id": {"$gt": 0}
的原因是因为 pouchdb-find / mango使用_all_docs
索引获取所有文档然后 处理内存中的$in
运算符。如果你有一个大型数据库,这将会受到伤害。但是你可以使用更好的价值 比
0
减少需要在内存中排序的文档数量, 这是一件好事。
所以,小心,"_id": {"$gt": 0}
绝不是一种使用索引的方式(这是@markwatsonatx建议时给我的印象),它只是一种抑制pouchdb的方法-find的警告,告诉它"我知道这不适合地图/减少,我将在allDocs上运行内存操作,而我&#39 ;我知道这个性能。后果" 。此外,
警告只是为了帮助任何刚接触芒果的人 做不是大型数据库的最佳方式,但在小型数据库上会很好 数据库。这是一种很好的实验方法,但一旦你开始注意到性能问题,创建索引就是前进的方向。
我补充了我制作的一些基准,比较了不同的方法来获取{10,100,1000,10000}"案例" (在索引字段上使用选择器)来自包含[10000个案例,100000个噪声文档]
的数据库
|number of cases fetched|10 |100 |1000 |10000 |
|-----------------------|------|-------|--------|------|
|$in |2452ms|2539ms |2474ms |5032ms|
|$in + $gt |905ms |784ms |1014ms |3805ms|
|$in + $gt + $lt |5ms |13ms |100ms |3854ms|
|$or |2638ms|11763ms|101279ms|- |