MongoDB 索引和 explain 的使用

索引基础

索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更快。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                                                         
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容