MongoDB的索引

来源:互联网 发布:数据对账 英文怎么说 编辑:程序博客网 时间:2024/05/21 11:40

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”的文档对象

 View Code

说明:这里的explain方法相当于查询计划,它会返回给你查询过程的详细信息。它的参数有三种模式:“queryPlanner”(查询计划[默认])、“executionStats”(执行状态)和“allPlansExecution”(所有执行计划),这里我们只关注它返回给我们的以下几个信息。

1 "executionTimeMillis" : 865  //执行的毫秒数 注:如果你是第一次执行,可能会花费更长的时间2 3 "totalDocsExamined" : 1000000  //共检查的文档数

第三步:在用户名“username”字段上加上索引

1 db.users.createIndex({ "username" : 1 }) 

 重新执行上次的查询操作

 View Code

可以看到两次的查询计划有很大的差别,我们还是着重看下那两个属性值。

1 "executionTimeMillis" : 53  //执行的毫秒数2 3 "totalDocsExamined" : 1  //共检查的文档数

加过索引之后查询这个文档所耗费的时间仅仅为53毫秒,并且扫描一次直接定位,性能提升了16倍。可见合理使用索引的重要性!

注:“_id”字段是Mongo为我们默认添加的索引,而且是唯一索引,保证了数据的唯一性,不可以移除。另外,使用limit(1)限制查询结果的数量也可以提高查询速度

3、索引的类型

a)、单一索引:可以在数据集上任意一个字段上建立索引,包括普通的属性键、内嵌文档以及内嵌文档中的属性键。

db.users.createIndex({ "username" : 1 })    //普通属性键的索引//假设class是一个内嵌的文档db.users.createIndex({ "class" : 1 })    //内嵌文档的索引 db.users.createIndex({ "class.classname" : 1 })    //内嵌文档中的属性键索引

索引方向:1表示升序,-1表示降序

b)、复合索引:以多个属性键为基础而建立得索引

1 db.users.createIndex({ "username" : 1, "age" : -1, "userid" : 1 })    //在“username”、“age”和“userid”上建立复合索引

索引前缀:通过建立上边的复合索引之后,Mongo就相当于同时拥有了三个索引一样,分别是{"username" : 1},{"username" : 1, "age" : -1}和{"username" : 1, "age" : -1, "userid" : 1},但是像{"age" : -1},{"userid" : 1}或者{"age" : -1, "userid" : 1}这三个索引并不会起作用。所以它会使用包含了前缀(首个)的索引的作为复合索引

c)、多键索引:为数组中的多个值建立索引以实现高效查询。

注:Ⅰ、不允许在多个数组上建立复合索引

  Ⅱ、不能指定片键作为多键索引

  Ⅲ、哈希索引不能是多键

  Ⅳ、多键索引不支持覆盖查询

d)、地理空间索引和查询:Mongo提供了两种曲面类型的索引:2dsphere索引和2d索引。查询类型包括:包含(inclusion),交叉(intersection)和接近(proximity)

e)、文本索引:用来支持查询包含了字符串或者字符串数组的文档

1 db.users.createIndex({"username" : "text"})

注:文本索引不支持排序并且一个复合文本索引不能再包含其他任何索引了

f)、哈希索引:它可以在使用了哈希片键进行分片的数据集上进行索引,支持相等查询,但是不支持范围查询

1 db.users.createIndex({"username" : "hashed"})

4、索引特性

a)、TTL(Time-To-Live)索引:是一种具有生命周期的索引,它允许为每一个文档设置一个超时时间

1 db.users.createIndex({ "createdate" : 1 },{ "expireAfterSecs" : 60*60*24 }) 

说明:在“createdate”字段上建立一个TTL索引,当这个自段存在并且是日期类型,当服务器时间比“createdate”字段的时间晚60*60*24秒,即24小时时,文档就会被删除

b)、唯一索引:确保集合的每一个文档的指定键都有唯一值

1 db.users.createIndex({"username" : 1}, {"unique" : true})

c)、稀疏索引:Mongo里边的null会被看做值,如果有一个可能存在也可能不存在的字段,我们可以使用稀疏索引

1 db.users.createIndex({"age" : 1},{"sparse" : true})

4、索引操作

a)、查看所有索引

1 db.users.getIndexes()

b)、移除索引

1 db.users.dropIndex({"createdate1" : 1 })

c)、移除所有索引

1 db.users.dropIndexes()

d)、重建索引

1 db.users.reIndex()

说明:该操作会先删除所有索引,包括“_id”,然后重新创建所有索引

服务、思考、安全
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩在家里偷钱怎么办 脾气不好的猫该怎么办 二年孩子偷钱怎么办 孩子偷钱2000报警怎么办? 我儿子十岁老是偷钱怎么办 13孩子偷同学钱怎么办 孩子偷同学的钱怎么办 儿子十四岁了老偷钱怎么办 发现初中生的儿子偷钱怎么办 被亲戚怀疑儿子偷钱怎么办 房门选的太白了怎么办 大厅地砖颜色比墙砖浅怎么办 房屋外墙渗水物业不管怎么办 走丢了怎么办教学反思 托班教案迷路了怎么办 大班安全教案遇到小偷怎么办 小班孩子舞台表演找不到位置怎么办 懂你英语学完了怎么办 小班社会走丢了怎么办 帮小老鼠搬鸡蛋怎么办 小老鼠还能怎么办鸡蛋 中班教案走丢了怎么办 走丢了怎么办可后反思 社会走丢了怎么办教案 孩子一直不吃幼儿园的饭怎么办 大班安全游泳抽筋怎么办反思 汤洒了怎么办教学反思 迷路了怎么办小班详案 大班牙又痛又摇怎么办 大班安全教案着火了怎么办 小班社会生病了怎么办反思 脚扭伤了怎么办的反思 中班安全迷了眼怎么办 15个月的小孩长泡疹怎么办 墨盒加错颜色墨水怎么办 墨盒颜色加错了怎么办 uV打印有色差是怎么办 cmyk和rgb有色差怎么办 染头发新长出来怎么办 白色衣服弄上口红怎么办 口红弄到牛仔裤上怎么办