mongodb查询优化,索引、复合索引、唯一索引、explain分析查询速度
-
分析语句查询时间
db.user.find().explain("executionStats")
分析结果:
{ "explainVersion" : "1", "queryPlanner" : { "namespace" : "itying.user", "indexFilterSet" : false, "parsedQuery" : { }, "maxIndexedOrSolutionsReached" : false, "maxIndexedAndSolutionsReached" : false, "maxScansToExplodeReached" : false, "winningPlan" : { "stage" : "COLLSCAN", "direction" : "forward" }, "rejectedPlans" : [ ] }, "executionStats" : { "executionSuccess" : true, "nReturned" : 0, "executionTimeMillis" : 4,//查询所用时长 4ms "totalKeysExamined" : 0, "totalDocsExamined" : 0, "executionStages" : { "stage" : "COLLSCAN", "nReturned" : 0, "executionTimeMillisEstimate" : 0, "works" : 2, "advanced" : 0, "needTime" : 1, "needYield" : 0, "saveState" : 0, "restoreState" : 0, "isEOF" : 1, "direction" : "forward", "docsExamined" : 0 } }, "command" : { "find" : "user", "filter" : { }, "$db" : "itying" }, "serverInfo" : { "host" : "LAPTOP-B85RC3JR", "port" : 27017, "version" : "5.0.2", "gitVersion" : "6d9ec525e78465dcecadcff99cce953d380fedc8" }, "serverParameters" : { "internalQueryFacetBufferSizeBytes" : 104857600, "internalQueryFacetMaxOutputDocSizeBytes" : 104857600, "internalLookupStageIntermediateDocumentMaxSizeBytes" : 104857600, "internalDocumentSourceGroupMaxMemoryBytes" : 104857600, "internalQueryMaxBlockingSortMemoryUsageBytes" : 104857600, "internalQueryProhibitBlockingMergeOnMongoS" : 0, "internalQueryMaxAddToSetBytes" : 104857600, "internalDocumentSourceSetWindowFieldsMaxMemoryBytes" : 104857600 }, "ok" : 1 }
在不设置索引的情况下,1000w条数据,查询可能需要4s(4000ms)左右。设置索引以后,可能只需要2ms。快了2000倍。
设置索引会让查询变得很快,但是插入、修改、删除就会变慢
创建索引的命令
// 创建索引的命令 // db.集合.ensureIndex({列名:1}) 1:升序 -1:降序 // db.集合.createIndex({列名:1}) 1:升序 -1:降序 新版本 db.user.createIndex({"username":1})
获取当前集合索引
// 获取当前集合的索引 db.user.getIndexes() //未加索引前 { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ] // 加索引后 [ { "v" : 2, "key" : { "_id" : 1 //默认索引 键 }, "name" : "_id_" //默认索引 名称 }, { "v" : 2, "key" : { "username" : 1 //自定义索引 键 }, "name" : "username_1" //自定义索引 名称 } ]
删除索引
// 删除索引的命令 // db.集合.dropIndex({列名:升降序}) 1:升序 -1:降序 db.user.dropIndex({"username":1})
当查询db.user.find({"username":"zhangsan1","age":30}) 这种多个条件时,想让查询的更快,就需要设置复合索引
必须在查询条件中包含复合索引中的前N个索引列
比如单独一个username条件,可以命中复合索引;username和age组合也可以命中复合索引;但是单独一个age条件,不能命中复合索引
创建复合索引
// 创建复合索引 db.user.createIndex({"username":1,"age":1}) [ { "v" : 2, "key" : { "_id" : 1 //默认索引 键 }, "name" : "_id_" //默认索引 名称 }, { "v" : 2, "key" : { //自定义索引 键 "username" : 1, "age" : 1 }, "name" : "username_1_age_1" //自定义索引 名称 } ]
设置索引名称
// 设置索引时 也可以设置索引的名字 db.user.createIndex({"username":1,"age":1},{"name":"username_age"})
设置唯一索引
// 唯一索引 // 缺省情况下创建的索引均不是唯一索引 // 设置唯一索引 db.user.createIndex({"username":1},{"unique":true}) // 如果一个列设置了唯一索引,在插入与此列重复的值时,mongo就会报错 // 比如username设置了唯一索引,数据中有了username=tom 当再次插入username=tom的数据时就会报错
-