使用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})
答案 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附带了一组很好的排序查询示例,并解释了对排序查询的高效索引使用的要求。