查询模式
单键索引
(1)精确匹配。 无论是返回0,1个还是多个结果,都使用索引。在这些查询里使用精确匹配,返回所有收盘价为100的入口
db.values.find({close:100})
(2)排序:在索引字段上排序
db.values.find({}).sort({close:1})
(3)范围查询:范围查询可能在同一个字段上使用或者不使用排序。例如:查询所有的收盘价格大于或者等于100的价格
db.values.find({close:{$gte:100}}).sort({close:1})
复合索引
有一个复合索引为{close:1, open:1, date:1}
(1)精确匹配。在第一个键上精确匹配,第
一个和第二个键,或者第一,第二和第三个键使用指定的顺序
db.values.find({close:1})
db.values.find({close:1, open:1})
db.values.find({close:1, open:1, date:"1985-01-08"})
(2)范围查询。在任意集合最左边键上的精确匹配,并且使用限制范围或者排序,因此下面所有的查询对于三键查询都是理想情况:
db.values.find({}).sort({close:1})
db.values.find({close:{$gt:1}})
db.values.find({close: 100}),sort({open:1})
db.values.find({close:100, open:{$gt : 1}})
db.values.find({close:1,. open:1.01, date:{$gt: "2005-01-01"}})
db.values.find({close:1, open:1.01}).sort({date:1})
总结:
1.索引非常有用,但是也有成本——他们会让写入变慢
2.mongo通常在一个查询里使用一个索引,所以多个字段的查询需要复合索引才能更加高效
3.当声明复合索引时顺序非常重要
4.应该避免昂贵的查询,使用mongodb的explain命令,它的昂贵查询日志以及分析器可以用来查找需要优化的查询。
5.mongo提供几个构建索引的命令,但是这些通常包含开销,而且可能影响到应用程序。这意味着在流量和数据暴增之前应该尽可能早地优化查询和创建索引
6.通过减少扫描的文档数量来优化查询,explain命令对于分析查询工作非常有用,它可以作为优化的向导