索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取 那些符合查询条件的记录。 这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站 的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
查看索引
>db.user.getIndexes() [ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ] #创建索引 #说明:1表示升序创建索引,-1表示降序创建索引 >db.user.createIndex({'age':1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }删除索引
#删除索引 db.user.dropIndex("age_1") #或者,删除除了_id之外的索引 db.user.dropIndexes()创建联合索引
db.user.createIndex({'age':1, 'id':-1})查看索引大小,单位:字节
db.user.totalIndexSize()MongoDB 查询分析可以确保我们建议的索引是否有效,是查询语句性能分析的重要工具。 插入100条数据
for(var i=1;i<100;i++)db.user.insert({id:100+i,username:'name_'+i,age:10+i})查看执行计划
> db.user.find({age:{$gt:100},id:{$lt:200}}).explain() { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "testdb.user", "indexFilterSet" : false, "parsedQuery" : { "$and" : [ { "id" : { "$lt" : 200 } }, { "age" : { "$gt" : 100 } } ] }, "queryHash" : "5DD09CA4", "planCacheKey" : "0167A000", "winningPlan" : { #查询方式,常见的有COLLSCAN/全表扫描、IXSCAN/索引扫描、 FETCH/根据索引去检索文档、SHARD_MERGE/合并分片结果、IDHACK/针对_id进行查询 "stage" : "FETCH", "filter" : { "id" : { "$lt" : 200 } }, "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "age" : 1 }, "indexName" : "age_1", "isMultiKey" : false, "multiKeyPaths" : { "age" : [ ] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "age" : [ "(100.0, inf.0]" ] } } }, "rejectedPlans" : [ ] }, "serverInfo" : { "host" : "ad8b3bc4d6e9", "port" : 27017, "version" : "4.4.1", "gitVersion" : "ad91a93a5a31e175f5cbf8c69561e788bbc55ce1" }, "ok" : 1 }我们可以看到其查询方式
常见的有COLLSCAN/全表扫描、IXSCAN/索引扫描、 FETCH/根据索引去检索文档、SHARD_MERGE/合并分片结果、IDHACK/针对_id进行查询 ,他们的效率依次变高