如何创建一个索引以适应我对mongodb的两个查询

时间:2013-12-02 12:22:55

标签: mongodb

使用system.profile集合,我能够收集我的应用程序上发生的查询。

我对以下两个从system.profile集合中收集的查询有疑问。

{ "query" : { "symbol" : "AAPL", "date" : "2013-11-29", "type" : "O"}, "orderby" : { "price" : 1 } }

{ query: { symbol: "AAPL", date: "2013-11-01", type: "O",  rootsymbol: "AAPL" }, orderby: { price: 1, buy_sell: 1 }

创建索引的正确方法是什么,以便它满足上述两个查询?

db.collection.ensureIndex({"symbol":1,"date":1,"type": 1,"rootsymbol":1,"price":1,"buy_sell":1},{"unique" : false})


OR 

创建3个查询,如下所示

db.collection.ensureIndex({"symbol":1,"date":1,"type": 1,"rootsymbol":1},{"unique" : false})

db.collection.ensureIndex({"price" : 1}, {"unique" : false})

db.collection.ensureIndex({"buy_sell" : 1}, {"unique" : false})

1 个答案:

答案 0 :(得分:1)

大锤解决方案是创建两个完全匹配您的查询的索引:

db.collection.ensureIndex({ "symbol" : 1, "date" : 1, "type" : 1, "price" : 1});

db.collection.ensureIndex({ "symbol" : 1, "date" : 1, "type" : 1,
                            "rootsymbol" : 1, "price" : 1, "buy_sell" : 1});

正如你所看到的,rootsymbol是我们需要第二个索引的唯一原因,所以如果你能摆脱它就会很棒 - 这很大程度上取决于你的数据,所以我可以'帮助你。例如,如果只有少量具有不同根符号的命中,那么过滤客户端的结果可能比使用第二个索引进行管理更有效。

documentation on sorting with indexes附带了一组很好的排序查询示例,并解释了对排序查询的高效索引使用的要求。