创建索引:
db.imooc_collection.getIndexes() 查看索引情况
db.imooc_collection.ensureIndex({x:1}) 创建索引,x:1代表正向排序,x:-1代表逆向排序
db.imooc_collection.dropIndex("normal_index") 删除索引,normal_index为索引名
 
 
索引的种类:
1._id索引
2.单键索引
3.多键索引
4.复合索引
5.过期索引
6.全文索引
7.地理位置索引
 
 
1._id索引:
_id索引是绝大多数集合默认建立的索引
对于每个插入的数据,mongoDB都会自动生成一条唯一的_id字段
会自动创建
 
 
 
 
2.单键索引:
单键索引是最普通的索引
例如:一条记录,形式为:{x:1,y:2,z:3}
我们在x字段上加条索引,之后就可以以x为条件进行查询
db.imooc_collection.ensureIndex({x:1})
 
 
 
 
 
3.多键索引:
多件索引和单键索引创建形式相同,区别在于字段的值
单键索引:值为一个单一的值,例如字符串,数字或者日期。
多键索引:值具有多个记录,例如数组。
db.imoc_collection.insert({x:[1,2,3,4,5,6,7,8,9]})
对于这组数据来讲,mongoDB便为x创建了多键索引
 
 
 
 
 
 
4.复合索引:
当我们的查询条件只有一个时,就需要建立复合索引
插入{x:1,y:2,z:3}记录-->按照x与y的值查询-->db.collection.ensureIndex({x:1,y:2})-->使用{x:1,y:2}作为条件进行查询
 
 
 
 
 
 
5.过期索引:
1.是在一段时间后会过期的索引。
2.在索引过期后,相应的数据会被删除。
3.这适合存储一些在一段时间之后会失效的数据,比如用户的登陆信息、存储的日志。
4.建立方法:
db.collection.ensureIndex({time:1},{expireAfterSeconds:10})
{time:1},需要索引的字段
{expireAfterSeconds:10},设置过期时间,单位为秒
 
db.collection.insert({time:new Date()}) 将当前时间插入进time列,检验是否10秒过后会自动删除
 
过期索引的限制:
1.存储在过期索引字段的值必须是指定的时间类型。
说明:必须是ISODate或者ISODate数组,不能使用时间戳,否则不能被自动删除
2.如果指定了ISODate数组,则按照最小的时间进行删除。
3.过期索引不能是复合索引。
4.删除时间不精确。
说明:删除过程是由后台程序每60秒跑一次,而且删除也需要一些时间,所以存在误差。
 
 
 
 
 
 
 
 
6.全文索引:
对字符串与字符串数组创建全文可搜索的索引
适用情况:
{author:"",titile:"",article:""}
建立方法:
db.articles.ensureIndex({key:"text"})
db.articles.ensureIndex({key_1:"text",key_2:"text"})
db.articles.ensureIndex({"$**":"text"})
db.imooc_2.ensureIndex({"article":"text"}) 以article为key创建全文索引
如何使用全文索引进行查询:
先插入几条数据:
db.imooc_2.insert({"article":"aa bb cc dd ee ff gg"})
db.imooc_2.insert({"article":"aa bb cc rr mm nn oo"})
db.imooc_2.insert({"article":"aa bb qrwq qw ww tt yy"})
db.imooc_2.insert({"article":"aa bb cc zz ii uu hh"})
db.imooc_2.insert({"article":"aa bb cc xx vv kk jj"})
再进行全文索引查询:
db.imooc_2.find({$text:{$search:"aa"}})
db.imooc_2.find({$text:{$search:"aa bb cc"}})======》默认是或查询,只要包含aa或者bb或者cc都会查询出来
db.imooc_2.find({$text:{$search:"aa bb -cc"}})======》-cc代表不包含cc这个字符串
db.imooc_2.find({$text:{$search:"\"aa\"\"bb\" \"cc\""}})======》与操作,既包含aa又包含bb又包含cc的字段查询出来,因为$search:的外面本来就有个双引号,所以这个里面需要用反斜杠将里面的双引号进行转意
 
 
 
全文索引相似度查询:
$meta操作符:{score:{$meta:"textScore"}}------>{$meta:"textScore"}是一个数值,代表与所查询条件的匹配度多少,值越高代表相似度越高,score只是用于显示的,可以改变,如:fenshu,随便你(最好就用score吧)
写在查询条件后面可以返回返回结果的相似度
与sort一起使用,可以达到很好的实用效果。
例:db.imooc_2.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}})
这条语句将会查找出包含 aa或者bb的字段并且按期相似度从高到低排序
 
 
 
 
全文索引的使用限制:
全文索引虽然非常强大,但是同样存在限制:
1.每次查询,只能指定一个$text查询
2.$text查询不能出现在$nor查询中
3.查询中如果包含了$text,hint不再起作用
4.MongoDB全文索引目前还不支持中文
 
 
索引属性----name指定
创建索引时的格式:
db.collection.ensureIndex({param},{param})
其中,第二个参数便是索引的属性。
比较重要的属性有:
名字,name指定:
db.collection.ensureIndex({x:1},{name:"normal_index"})
唯一性,unique指定:
db.collection.ensureIndex({x:1},{unique:true/false})
稀疏性,sparse指定:
db.collection.ensureIndex({x:1},{sparse:true/false})
是否定时删除,expireAfterSeconds指定:
db.collection.ensureIndex({x:1},{expireAfterSeconds:10})
 
 
 
 
7.地利位置索引:
概念:将一些点的位置存储在mongoDB中,创建索引后,可以按照位置来查找其他点。
子分类:2d索引,用于存储和查找平面上的点
2dsphere索引,用于存储和查找球面上的点
查找方式:
1.查找距离某个点一定距离内的点
2.查找包含在某区域内的点
 
 
2d索引:平面地理位置索引
创建方式:db.location.ensureIndex({"w":"2d"})
位置表示方式:经纬度[经度,纬度]
取值范围:经度[-180,180]纬度[-90,90]
先插入几条数据:
db.location.insert({w:[1,2]})
db.location.insert({w:[4,3]})
db.location.insert({w:[6,5]})
db.location.insert({w:[120,50]})
查询方式:
(1).$near查询:查询距离某个点最近的点
例:
db.location.find({w:{$near:[1,1],$maxDistance:10}}) $maxDistance用来设定最大距离
(2).$geoWithin查询:查询某个形状内的点
形状的表示:
1.$box:矩形,使用
{$box:[[<x1>,<y1>],[<x2>,<y2>]]}表示
例:
db.location.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}})
 
2.$center:圆形,使用
{$center:[[<x1>,<y1>],r]}表示
例:
db.location.find({w:{$geoWithin:{$center:[[0,0],5]}}})
 
3.$polygon:多边形,使用
{$polygon:[[<x1>,<y1>],[<x2>,<y2>],[<x3>,<y3>]]}表示
例:
db.location.find({w:{$geoWithin:{$polygon:[[0,0],[0,1],[2,5],[6,1]]}}})
(3).geoNear查询:
geoNear使用runCommand命令进行使用,常用使用如下:
db.runCommand(
{geoNear:<collection>,
near:[x,y],
minDistance:(对2d索引无效)
maxDistance:
num:
...})
例:
db.runCommand({geoNear:"location",near:[1,2],maxDistance:10,num:1})
 
 
2dsphere索引:
概念:球面地理位置索引
创建方式:db.collection.ensureIndex({w:"2dsphere"})
 
位置表示方式:
GeoJSON:描述一个点,一条直线,多边形等形状。
格式:
{type:" ",coordinates:[<coordinates>]}
 
查询方式与2d索引查询方式类似,
支持$minDistance与$maxDistance
 
索引构建情况分析:
索引好处:加快索引相关的查询
索引不好处:增加磁盘空间消耗,降低写入性能
 
 
如何评判当前索引构建情况:
1.mongostat工具介绍
mongostat:查看mongodb运行状态的程序
使用说明:mogostat -h 127.0.0.1:12345
字段说明:
索引情况:idx miss 索引丢失的情况,如果很高,说明我们创建的索引有问题
切换到mongoDB的bin目录
./mongostat --help 查看帮助
一般我们比较关心的段:
这几个值都是越低代表性能越好
qr:读队列
qw:写队列
idx miss:
 
2.profile集合介绍
db.getProfilingStatus() 查看profile的状态
db.getProfilingLevel() 查看profile的级别
级别分别为0,1,2
0级别 profile是关闭的,不记录任何操作
1级别 配合slowms的域值,记录所有操作超过slowms的操作
2级别 记录所有操作
 
设置profile级别:
db.setprofilingLevel(2)
设置之后使用show tables会发现mongoDB的表里会新增一个System.profile的表,用来记录我们对mongoDB的操作
我们使用
db.system.profile.find().sort({$natural:-1}).limit(1) $natural用来指定以时间先后排序,-1代表最近的操作,1代表最远的操作。
 
 
3.日志介绍
log/mongod.log
 
4.explain分析
db.imooc_2.find({x:1}).explain()-------->可以用来查看你的这个特定查看是否使用索引,会显示你的查询的详细信息
 

3、mongoDB索引的更多相关文章

  1. [DataBase] MongoDB (7) MongoDB 索引

    MongoDB 索引 1. 建立索引 唯一索引db.passport.ensureIndex( {"loginname": 1}, {"unique": tru ...

  2. MongoDB索引介绍

    MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索 ...

  3. MongoDB(索引及C#如何操作MongoDB)(转载)

    MongoDB(索引及C如何操作MongoDB) 索引总概况 db.test.ensureIndex({"username":1})//创建索引 db.test.ensureInd ...

  4. MongoDB索引(一)

    原文地址 一.介绍 我们已经很清楚索引会提高查询效率.如果没有索引,MongoDB必须对全部集合进行扫描,即,扫描集合中每条文档以选择那些符合查询条件的文档.对查询来说如果存在合适的索引,则Mongo ...

  5. MongoDB 索引篇

    MongoDB 索引篇 索引的简介 索引可以加快查询的速度,但是过多的索引或者规范不好的索引也会影响到查询的速度.且添加索引之后的对文档的删除,修改会比以前速度慢.因为在进行修改的时候会对索引进行更新 ...

  6. MongoDB索引的种类与使用

    一:索引的种类 1:_id索引:是绝大多数集合默认建立的索引,对于每个插入的数据,MongoDB都会自动生成一条唯一的_id字段2:单键索引: 1.单键索引是最普通的索引 2.与_id索引不同,单键索 ...

  7. MongoDB索引,性能分析

    索引的限制: 索引名称不能超过128个字符 每个集合不能超过64个索引 复合索引不能超过31列 MongoDB 索引语法 db.collection.createIndex({ <field&g ...

  8. MongoDB索引原理

    转自:http://www.mongoing.com/archives/2797 为什么需要索引? 当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下M ...

  9. MongoDB · 引擎特性 · MongoDB索引原理

    MongoDB · 引擎特性 · MongoDB索引原理数据库内核月报原文链接 http://mysql.taobao.org/monthly/2018/09/06/ 为什么需要索引?当你抱怨Mong ...

  10. MongoDB索引管理

    一.创建索引 创建索引使用db.collectionName.ensureIndex(...)方法进行创建: 语法: >db.COLLECTION_NAME.ensureIndex({KEY:1 ...

随机推荐

  1. react-native自定义Modal模态框|仿ios、微信弹窗RN版

    前序 纵观每个优质项目,无论web端还是native原生应用开发,弹窗都是不可忽视的一环,能很大程度上直接决定用户体验.如:微信.支付宝.ios都有很成熟的一套弹窗UI展示场景. 最近一直沉迷在rea ...

  2. bay——Oracle RAC环境下ASM磁盘组扩容.docx

    https://www.cnblogs.com/polestar/p/10115263.html Oracle RAC环境下ASM磁盘组扩容 生产环境注意调整以下参数: +++++++++++++++ ...

  3. fork函数的一些小结

    今天遇到一个这样的问题,假设父进程有一个变量S,fork后,子进程中的变量S地址是否和父进程中的变量S 是相同的? 再学操作系统的时候,知道fork是采用的写时复制,所以如果子进程或者父进程不对变量S ...

  4. ssm所需依赖

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  5. DenyHosts

    下载软件并解压cd DenyHosts-2.6 #进入安装解压目录python setup.py install #安装DenyHostscd /usr/share/denyhosts/ #默认安装路 ...

  6. BZOJ1369/LG4395 「BOI2003」Gem 树形DP

    问题描述 LG4395 BZOJ1369 题解 发现对于结点 \(x\) ,其父亲,自己,和所有的孩子权值不同,共 \(3\) 类,从贪心的角度考虑,肯定是填 \(1,2,3\) 这三种. 于是套路树 ...

  7. Leetcode 153. 寻找旋转排序数组中的最小值

    假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 请找出其中最小的元素. 你可以假设数组中不存在重 ...

  8. Java程序猿想要月薪2万+必须必备哪些技术?

    现在程序员是比较紧俏的一个岗位,其实可以写代码的人许多,但是为什么程序员还那么缺呢? 除了需求大以外,还有一个原因就是,实在合格的程序员确实比较少. 想要成为一个合格的程序员,咱们需求满意以下几点要求 ...

  9. CF732D Exams

    这题可以用二分答案来做 那么为什么可以用二分答案呢? 答案当然是满足了单调性. 假设用\(x\)天能够考完所有试,那么用大于$x $天必定也能够考完所有试,所以满足了单调性,我们就可以二分答案 那么如 ...

  10. 关于powermock报错org.powermock.reflect.exceptions.FieldNotFoundException: Field 'fTestClass' was not found in class org.junit.internal.runners.MethodValidator.问题解决

    事件背景 使用PowerMock模拟一个局部变量,添加@RunWith(PowerMockRunner.class).@PrepareForTest(StudentService.class)注解成功 ...