查询优化器是MongoDB的一部分,如果存在可用的索引,它会为给定查询选择一个最高效的索引。在为查询选择理性的索引时,优化查询器使用了一套相对简单的规则:
(1) 避免scanAndOrder,如果查询中包含排序,尝试使用索引进行排序;
(2) 通过有效的索引约束来满足所有字段--尝试对查询选择器里的字段使用索引
(3) 如果查询包含范围查找或者排序,那么对于选择的索引,其中最后用到的键需能满足该范围查找或者排序。
如果某个索引能满足以上所有这些条件,那么它会被视为最佳索引并予以使用。要是有多个最佳索引,则任意选择一个。可以遵循这条经验:如果能为查询构建最优索引,查询优化器的工作能更轻松些。
下面有一个查询,它完全满足索引(和查询优化器)。回顾股票数据集,假设要执行如下查询,获取所有大于200的谷歌收盘价:
db.stock.find({stock_symbol:"GOOG",close:{$gt:200}})
该查询的最优索引同时包含这两个键,但是其中把close键放在最后以便执行范围查询。
db.stock.ensureIndex({stock_symbol:1,close:1})
如果执行查询,可以看到这两个键都被用到了,索引边界也与预想的一样: