美文网首页
MongoDB 索引和 explain 的使用

MongoDB 索引和 explain 的使用

作者: shadow123 | 来源:发表于2020-12-03 17:48 被阅读0次

    索引基础

    索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更快。MongoDB 的索引几乎与传统的关系型数据库一模一样。

    创建索引的命令:

    db.user.ensureIndex({"username":1})
    

    获取当前集合的索引:

    db.user.getIndexes()
    

    删除索引的命令:

    db.user.dropIndex({"username":1})
    

    创建复合索引:

    db.user.ensureIndex({"username":1,"age":-1})
    

    其中 1 表示 username 键的索引按升序存储,-1 表示 age 键的索引按降序存储。

    复合索引被创建后,基于 username 和 age 的查询将会用到复合索引,或者是基于 username
    的查询也会用到复合索引, 但是只是基于 age 的查询将不会用到复合索引。

    指定索引名:

    db.user.ensureIndex({"username":1},{"name":"username"})
    

    唯一索引

    在缺省情况下创建的索引均不是唯一索引。

    创建唯一索引:

    db.user.ensureIndex({"username":1},{"unique”:true})
    

    如果重复插入username键,MongoDB 将会报错。如果插入的文档中不包含 username 键,那么该文档中该键的值为 null,如果多次插入类似的文档,MongoDB 将会报出同样的错误。

    db.user.insert({"username","user001"})
    db.user.insert({"username","user001"})
    // errmsg "E11000 duplicate key error collection: admin.user index: username_1 dup key: { username: \"user001\" }" 
    db.user.insert({"age":18})
    db.user.insert({"age":18})
    // errmsg "E11000 duplicate key error collection: admin.user index: username_1 dup key: { username: null }"
    

    索引的参数

    • background:创建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引。默认值为false
    • unique:创建索引是否唯一,默认值为false
    • name:索引的名称。
    • dropDups:在创建唯一索引时是否删除重复记录,默认值为false。

    在后台创建索引:

    db.ensureIndex({"username":1},{"background":true})
    

    explain

    explain 会帮助你获取查询方面诸多有用的信息。

    用法:

    db.user.find({"username":"user001"}).explain("executionStats")
    // explain.executionStats.executionTimeMillis 毫秒时间
    "queryPlanner" : {                                               
            "plannerVersion" : 1,                                    
            "namespace" : "admin.user",                              
            "indexFilterSet" : false,                                
            "parsedQuery" : {                                        
                    "username" : {                                   
                            "$eq" : "user001"                        
                    }                                                
            },                                                       
            "winningPlan" : {                                        
                    "stage" : "COLLSCAN",                            
                    "filter" : {                                     
                            "username" : {                           
                                    "$eq" : "user001"                
                            }                                        
                    },                                               
                    "direction" : "forward"                          
            },                                                       
            "rejectedPlans" : [ ]                                    
    },                                                               
    "executionStats" : {                                             
            "executionSuccess" : true,                               
            "nReturned" : 2,                                         
            "executionTimeMillis" : 87,                              
            "totalKeysExamined" : 0,                                 
            "totalDocsExamined" : 100003,                            
            "executionStages" : {                                    
                    "stage" : "COLLSCAN",                            
                    "filter" : {                                     
                            "username" : {                           
                                    "$eq" : "user001"                
                            }                                        
                    },                                               
                    "nReturned" : 2,                                 
                    "executionTimeMillisEstimate" : 0,               
                    "works" : 100005,                                
                    "advanced" : 2,                                  
                    "needTime" : 100002,                             
                    "needYield" : 0,                                 
                    "saveState" : 781,                               
                    "restoreState" : 781,                            
                    "isEOF" : 1,                                     
                    "direction" : "forward",                         
                    "docsExamined" : 100003                          
            }                                                        
    },                                                               
    "serverInfo" : {                                                 
            "host" : "DESKTOP-4VM2FGH",                              
            "port" : 27017,                                          
            "version" : "4.2.1",                                     
            "gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
    },                                                               
    "ok" : 1                                                         
    

    相关文章

      网友评论

          本文标题:MongoDB 索引和 explain 的使用

          本文链接:https://www.haomeiwen.com/subject/doxvwktx.html