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的数据时就会报错

 

 

-

posted @ 2021-08-24 23:31  古墩古墩  Views(528)  Comments(0Edit  收藏  举报