MongoDB 索引和 explain 的使用

2020-12-03  本文已影响0人  shadow123

索引基础

索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更快。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 }"

索引的参数

在后台创建索引:

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                                                         
上一篇 下一篇

猜你喜欢

热点阅读