MongoDB学习笔记_5_索引

Wesley13
• 阅读 322

索引

概念

  • 建立指定键值及所在文档中的存储位置对照关系清单。使用索引可以方便我们快速查找,减少遍历次数,提高效率。

操作

  • 创建索引
    • db.collection_name.ensureIndex()
      • 功能:创建索引
      • 参数:提供索引的类别选项
        • 1表示为该域创建正向索引
        • -1表示逆向索引
      • e.g. 根据name域创建索引 db.class.ensureIndex({'name':1})
      • e.g. 根据name域,age域创建复合索引 db.class.ensureIndex({'name':1,age:1})
      • 系统自动为_id创建索引
  • 查看当前集合的索引
    • db.collection_name.getIndexs()
  • 删除索引
    • db.collection_name.dropIndex()
      • 功能:删除索引
      • 参数: 索引名称
      • _id 索引不能被删除
      • e.g.:db.class.dropIndex({'name':1,age:1})
  • 删除当前集合中除_id外的所有索引
    • db.collection_name.dropIndexes()
  • 显示详细的查找操作信息
    • explain()
    • e.g. db.class.find({age:22}).explain()

索引类型

类型

作用

例子

数组索引

如果对某个数组域创建索引,则对数组中的每个值均创建了索引。通过数组中单个值查询也会提高效率

db.class.ensureIndex({hobby:1})

子文档索引

某个域值为文档,对其子文档创建索引,则加快通过子文档进行查找的查找速度

db.class.ensureIndex({'parent.child':1})

唯一索引

唯一索引创建时希望索引的域值有不同的值,也可以通过这个方法限制域值

db.class.ensureIndex({name:1},{'unique':1})

覆盖索引

查找时,只获取索引项的内容,而不去连接其他文档内容。这样从索引表就可以到得到查询结果,提高查询效率

索引为name查找项也只有name db.class.find({name:'a'},{_id:0,name:1})

稀疏索引(间隙索引)

只针对有指定域的文档创建索引,没有该域的文档不加入索引

db.class.ensureIndex({age:1},{sparse:true})

文本索引

使用文本索引可以快速进行文本检索,这在较长的字符串搜索中比较有用,可进行多个关键词匹配,以空格隔开,如搜索内容包含空格,空格需要转义字符(\"keyword\"),'-'表示不包含

1. 创建文本索引db.class.ensureIndex({msg:'text',description:'text'}) ——— 2. 检索(包含"keyword1"或者"key word 2"且不包含"keyword3") db.class.find({$text:{$search:"keyword1 \"key word 2\" -keyword3"}}) 3.删除文本索引 通过getIndex()查看索引名,再通过dropIndex()删除

索引约束

  1. 影响插入,删除,修改数据的效率。当数据发生修改时,索引必须同步更新。
  2. 索引也占有一定的空间,所以当数据量比较小时不适宜创建索引。

固定集合

  • MongoDB中可以创建大小固定的集合,称之为固定集合,固定集合性能出色且适用很多场景。如:日志处理,临时缓存
  • 特点:
    1. 插入输入快
    2. 顺序查询速度快
    3. 能够淘汰早期的数据
  • 创建固定集合
    • db.createCollection('collection_name',{capped:true,size:10000,max:1000})
      • size: 表示设置的固定集合的大小,单位kb
      • max:表示固定集合中最多存放多少条文档
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
添砖java的啾 添砖java的啾
2年前
distinct效率更高还是group by效率更高?
目录00结论01distinct的使用02groupby的使用03distinct和groupby原理04推荐groupby的原因00结论先说大致的结论(完整结论在文末):在语义相同,有索引的情况下groupby和distinct都能使用索引,效率相同。在语义相同,无索引的情况下:distinct效率高于groupby。原因是di
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
wanQQ wanQQ
2年前
restful 风格操作es 学习
restful风格操作es|method|url地址|描述||::|::|::||PUT|host:port/索引名/类型名/文档ID|创建文档(指定文档ID)||POST|ho
Wesley13 Wesley13
2年前
MySQL索引的索引长度问题
MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制。在MyISAM表中,创建组合索引时,创建的索引长度不能超过1000,注意这里索引的长度的计算是根据表字段设定的长度来标量的,例如:createtabletest(idint,name1varchar(300),name2varchar(300),nam
Wesley13 Wesley13
2年前
mysql5.6 分页查询优化
mysql5.6分页查询优化场景:表结构:主键(非自增)contentCode(varchar),过滤条件列为updateTime(timeStamp),已经为timestamp建立索引。搜索sql为:SELECTFROMmy_hello_tableWHEREupdat
Wesley13 Wesley13
2年前
mysql之索引
一.索引:索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,会保存在额外的文件中1.1.创建一个索引:mysqlcreateindexix_classontb3(class_id);QueryOK,0rowsaffected(0.02sec)
Stella981 Stella981
2年前
ES中删除索引的mapping字段时应该考虑的点
1.创建新索引2.新索引创建新mapping3.原索引导出数据到新索引4.新索引创建原索引一致的别名5.删除原索引针对于第四步:这个就要用到索引别名了,如果你最开始建索引的时候没有考虑设计索引别名,那就杯具了。你可以把索引的名称设置成name\_v1 别名设置为name,然后代码里面访问搜索的时候连接的其实是别名na
Stella981 Stella981
2年前
ELK学习笔记之ElasticSearch的索引详解
0x00ElasticSearch的索引和MySQL的索引方式对比Elasticsearch是通过Lucene的倒排索引技术实现比关系型数据库更快的过滤。特别是它对多条件的过滤支持非常好,比如年龄在18和30之间,性别为女性这样的组合查询。倒排索引很多地方都有介绍,但是其比关系型
Wesley13 Wesley13
2年前
MongoDB性能篇
一、索引MongoDB提供了多样性的索引支持,索引信息被保存在system.indexes中,且默认总是为\_id创建索引,它的索引使用基本和MySQL等关系型数据库一样。其实可以这样说说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口并不足为奇。1.基础索引在字段age