索引
索引能够使得MongoDB更高效得执行查询。如果没有索引,MongoDB必须执行集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。如果查询存在适当的索引,MongoDB可以使用索引来直接处理索引对应的文档内容。 MongoDB在集合级别定义索引,并支持MongoDB集合中文档的任何字段或子字段的索引。值得注意的是,当你执行索引相关得查询时,结果会按照索引要求自动排序。
默认_id索引
MongoDB 在创建集合期间在_id字段上 创建唯一索引。该索引可防止客户端插入具有相同字段的两个文档。您不能在该字段上删除此索引。
创建索引
db.collection.createIndex( <key and index type specification>, <options> )
以下示例在name
字段上创建单个键降序索引:
db.collection.createIndex( { name: -1 } )
单字段
除MongoDB定义的_id
索引外,MongoDB还支持在文档的单个字段上创建用户定义的升序/降序索引。对于单字段索引和排序操作,索引键的排序顺序(即升序或降序)无关紧要,因为MongoDB可以在任一方向上遍历索引。
db.records.createIndex( { score: 1 } ) //score 在records集合的字段上创建升序索引
对嵌入式字段创建索引
db.records.createIndex( { "location.state": 1 } )
对嵌入式文档创建索引
db.records.createIndex( { location: 1 } )
多字段(复合索引)
多字段的用户定义索引称之为复合索引
复合索引中列出的字段顺序具有重要意义。
例如,如果复合索引由{userid:1,score:-1}组成,则索引首先按用户标识排序,然后在每个用户标识值内按排名排序。
多键索引
首先,如果任何索引字段是数组,MongoDB会自动创建一个多键索引;您不需要显式指定多键类型 。同时对于多键复合索引,索引最多支持一个数组。
创建多键索引 : db.coll.createIndex( { <field>: < 1 or -1 > } )
字段排序
用单字段索引排序
如果升序索引或降序索引位于单个字段上,则字段上的排序操作可以是任一方向。
例如:
db.records.createIndex( { a: 1 } ) 在a集合的字段上创建升序索引
recordsdb.records.find().sort( { a: 1 } ) 升序排序a
用多字段索引排序
创建复合索引以支持对多个字段进行排序。
您可以在索引的所有键或子集上指定排序; 但是,排序键必须按它们在索引中出现的顺序列出。例如,一个索引键对`{ a: 1, b: 1 },可以针对{ a: 1, b: 1 }排序,但{ b: 1, a: 1 }就不行。
Explain
我们的查询结构本身就有可能不简洁优美、这时可以通过explain(),来查看一个查询(find)的explain()输出信息,可以知道查询使用了哪个索引,以及是如何使用的。
最常见的输出有两种类型:使用索引的查询和没有使用索引的查询。
MongoDB提供db.collection.explain()
方法, cursor.explain()
方法和explain
命令,以返回有关查询计划和查询计划的执行统计信息的信息。
相关:
https://docs.mongodb.com/manual/indexes/
https://www.jb51.net/article/87983.htm
https://www.sohu.com/a/196402037_470008