翻译自 官方文档 create-indexes-to-support-queries
创建索引支持你的查询
当索引(index)包含所有查询(query)包含的字段时,索引就支持这个查询。这个查询会扫描这个索引而不是集合。创建支持查询的索引可以极大地增长查询性能。这篇文章描述了创建支持查询的索引的策略。
创建单键索引(Single-Key Index)
如果你只用某集合的一个 key 来做查询,那么你需要为这个集合创建一个仅有一个 key 的索引。例如,你可能在 product
集合的 category
上创建一个索引:
db.products.createIndex( { "category": 1 } )
创建复合索引(compound index)
如果你有时查询时不仅仅用一个 key,有时还联合第二个 key,那么,创建一个复合索引比创建一个单键索引更有效率。这两种查询,MongoDB 都可以用一个复合索引。例如,你可能在 category
和 item
上创建一个索引。
db.products.createIndex( { "category": 1, "item": 1 } )
这个索引给了你两个选择。你可以仅仅用 category
查询,同样也可以用 category
联合 item
查询。一个在多个字段上的复合索引,只要查询字段是索引字段的“前缀”子集字段,这个索引就可以支持所有的这类查询。
例如,一个集合上有索引
{ x: 1, y: 1, z: 1 }
,可以支持查询以下索引命中的所有查询:{ x: 1 }
和{ x: 1, y: 1 }
。这里有一些前缀的索引可能提供了更好性能的场景,例如 当
z
是一个大的数组 时,索引{ x: 1, y: 1, z: 1 }
也可以支持很多能用到索引{ x: 1, z: 1 }
的查询。但是,
{ x: 1, z: 1 }
有一个其他的使用。当 query 为db.collection.find( { x: 5 } ).sort( { z: 1} )
时,索引{ x: 1, z: 1 }
即支持查询也支持排序操作,但{ x: 1 , y: 1, z: 1 }
只支持查询。
从 MongoDB 2.6 版本开始,MongoDB 可以用 交叉索引(index intersection,译文参考)来满足查询。是选用复合索引还是依赖于你的系统使用用交叉索引以满足你的查询,见 Index Intersection and Compound Indexes 。
网友评论