MongoDB索引
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB索引相关的知识,希望对你有一定的参考价值。
参考技术A 对普通字段创建索引对内嵌的文档字段创建索引
复合索引的字段顺序、字段的升降序对查询性能有影响,
也叫多值索引,
数组索引必然会使索引的条目和体积发生膨胀。为了避免时空,有必要在文档设计上做出一些限制。
MongoDB不支持一个复合索引中同时出现多个数组字段。
专门用于实现位置检索的一种特殊索引。
例如:
location字段是一个内嵌型文档,用于表明商家的地理位置,其中type表示这是地图上的一个点,coordinates则是经纬度。
接下来创建一个2dsphere索引,如下:
最后,执行查询,检索附件5千米内的商家,如下:
例如
对于制定字段已经存在重复记录的集合,尝试创建唯一性索引会报错。
对于老化数据的处理,MongoDB提供了便捷的做法,TTL索引,通过声明一个日期类型的字段,然后在日期字段上加上TTL索引:
创建TTL索引后,该数据会在3600秒后过期,MongoDB会周期性运行后台线程中对该集合进行检查及数据清理工作。
MongoDB的索引操作
Mongodb的索引操作
学习目标
- 掌握 mongodb索引的创建,删除操作
- 掌握 mongodb查看索引的方法
- 掌握 mongodb创建唯一索引的方法
1. 为什么mongdb需要创建索引
- 加快查询速度
- 进行数据的去重
2. mongodb创建简单的索引方法
- 语法:
db.集合名.ensureIndex({属性:1})
,1表示升序, -1表示降序
3. 创建索引前后查询速度对比
测试:插入10万条数据到数据库中
插入数据:
for(i=0;i<100000;i++){db.t1.insert({name:'test'+i,age:i})}
创建索引前:
db.t1.find({name:'test10000'})
db.t1.find({name:'test10000'}).explain('executionStats') # 显示查询操作的详细信息
创建索引:
db.t1.ensureIndex({name:1})
创建索引后:
db.t1.find({name:'test10000'}).explain('executionStats')
前后速度对比
4. 索引的查看
默认情况下_id是集合的索引
查看方式:db.集合名.getIndexes()
5. 删除索引
语法:db.集合名.dropIndex({'索引名称':1})
db.t1.dropIndex({name:1})
db.t1.getIndexes()
6. mongodb创建唯一索引
在默认情况下mongdb的索引域的值是可以相同的,创建唯一索引之后,数据库会在插入数据的时候检查创建索引域的值是否存在,如果存在则不会插入该条数据,但是创建索引仅仅能够提高查询速度,同时降低数据库的插入速度。
6.1 添加唯一索引的语法:
db.集合名.ensureIndex({"字段名":1}, {"unique":true})
6.2 利用唯一索引进行数据去重
根据唯一索引指定的字段的值,如果相同,则无法插入数据
db.t1.ensureIndex({"name":1}, {"unique":true})
db.t1.insert({name: 'test10000'})
7. 建立复合索引
在进行数据去重的时候,可能用一个域来保证数据的唯一性,这个时候可以考虑建立复合索引来实现。
例如:抓全贴吧信息,如果把帖子的名字作为唯一索引对数据进行去重是不可取的,因为可能有很多帖子名字相同
建立复合索引的语法:db.collection_name.ensureIndex({字段1:1,字段2:1})
8. 建立索引注意点
-
根据需要选择是否需要建立唯一索引
-
索引字段是升序还是降序在单个索引的情况下不影响查询效率,但是带复合索引的条件下会有影响
-
数据量巨大并且数据库的读出操作非常频繁的时候才需要创建索引,如果写入操作非常频繁,创建索引会影响写入速度
例如:在进行查询的时候如果字段1需要升序的方式排序输出,字段2需要降序的方式排序输出,那么此时复合索引的建立需要把字段1设置为1,字段2设置为-1
课后思考
数据库为什么要做读写分离(读写分离的意义)?
9. 小结
- 掌握mongodb索引的创建,删除操作
- 掌握mongodb查看索引的方法
- 掌握mongodb创建唯一索引的方法
以上是关于MongoDB索引的主要内容,如果未能解决你的问题,请参考以下文章