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

    -

  • 相关阅读:
    .NET中string和StringBuilder的区别
    Hashtable 类
    C#中null和""的区别
    Dictionary 泛型类
    宿主进程含义
    事件和委托
    关于SQLServer中索引使用及维护简介
    什么是序列化
    “锁定”语句(C# 参考)
    栈和托管堆/值类型和引用类型/强制类型转换/装箱和拆箱[C#]
  • 原文地址:https://www.cnblogs.com/fqh123/p/15183050.html
Copyright © 2020-2023  润新知