五、MongoDB的索引
1、简介
它就像是一本书的目录,如果没有它,我们就需要对整个书籍进行查找来获取需要的结果,即所说的全盘扫描;
而有了目录(索引)之后就可以通过它帮我们定位到目标所在的位置,快速的获取我们想要的结果。
2、演示
第一步,向用户集合users中插入100W条数据
1 var insertUsers = function() { 2 var start = new Date().getTime(); 3 for (var i = 1; i <= 1000000; i++) { 4 db.users.insert({ 5 "userid": i, 6 "username": "wjg" + i, 7 "age": Math.floor(Math.random() * 100), //年龄为0~99的随机整数 8 "createdate": new Date() 9 }) 10 } 11 var end = new Date().getTime(); 12 print("插入100W条数据共耗时" + (end - start) / 1000 + "秒"); 13 }
LZ的渣渣I3和4G内存总共耗时了484.623秒,约8分多钟。任务管理器里边可以很清楚的看到当时CPU、内存和磁盘使用率都普遍的增高。
第二步:查询用户名为“wjg465413”的文档对象
1 db.users.find({username:"wjg465413"}).explain("allPlansExecution") 2 { 3 "queryPlanner" : { 4 "plannerVersion" : 1, 5 "namespace" : "test.users", 6 "indexFilterSet" : false, 7 "parsedQuery" : { 8 "username" : { 9 "$eq" : "wjg465413" 10 } 11 }, 12 "winningPlan" : { 13 "stage" : "COLLSCAN", 14 "filter" : { 15 "username" : { 16 "$eq" : "wjg465413" 17 } 18 }, 19 "direction" : "forward" 20 }, 21 "rejectedPlans" : [ ] 22 }, 23 "executionStats" : { 24 "executionSuccess" : true, 25 "nReturned" : 1, 26 "executionTimeMillis" : 865, 27 "totalKeysExamined" : 0, 28 "totalDocsExamined" : 1000000, 29 "executionStages" : { 30 "stage" : "COLLSCAN", 31 "filter" : { 32 "username" : { 33 "$eq" : "wjg465413" 34 } 35 }, 36 "nReturned" : 1, 37 "executionTimeMillisEstimate" : 770, 38 "works" : 1000002, 39 "advanced" : 1, 40 "needTime" : 1000000, 41 "needFetch" : 0, 42 "saveState" : 7813, 43 "restoreState" : 7813, 44 "isEOF" : 1, 45 "invalidates" : 0, 46 "direction" : "forward", 47 "docsExamined" : 1000000 48 }, 49 "allPlansExecution" : [ ] 50 }, 51 "serverInfo" : { 52 "host" : "Jack", 53 "port" : 27017, 54 "version" : "3.0.3", 55 "gitVersion" : "b40106b36eecd1b4407eb1ad1af6bc60593c6105" 56 }, 57 "ok" : 1 58 }