MongoDB索引

1.语法准备

  • ​ explain() :查看执行计划
  • ​ getIndexes() :查看所有索引
  • ​ hint() : 强制使用某一索引进行查询

2.数据准备:

{
"_id" : ObjectId("6127594238754d0067383ff6"),
"xh" : 1,
"szly" : {
"lymc" : "AA大厦",
"z" : "A",
"lh" : "1",
"sy" : "啥意思"
},
"qtxx" : {
"nsssjg" : "A、区内",
"sfwkgh" : "否",
"cylx" : "第三产业",
"rzlysj" : "2011.11",
"fwcqdw" : "河南置业有限公司",
"fwszlc" : "5",
"fjh" : "601、604",
"mj" : 56,
"cyry" : 5,
"yzj" : 2,
"qylx" : "H、其他",
"ssqylx" : "C、非上市企业",
"lxr" : "AA兰",
"lxdh" : "85685685"
},
"sssq" : "裕鸿楼宇社区",
"frxx" : {
"qyfr" : "AA兰",
"qyfzr" : "AA兰",
"lxfs" : "18888888888"
},
"qyjbxx" : {
"xy" : "P 教育",
"qymc" : "郑州市管城回族培训学校",
"gsyyzzh" : "31313123",
"swdjzh" : "123123123",
"tyxydm" : "313123123",
"zcdz" : "裕鸿国际A座6层",
"jjxz" : "有限责任公司",
"zczb" : 100
},
"importMonth" : "202108",
"batch" : "1629968706400_1",
"createBy" : "1",
"department" : "区政府",
"createTime" : ISODate("2021-08-26T09:05:06.416Z"),
"status" : 0,
"ddly" : {
"zh" : "",
"lh" : "",
"sy" : ""
},
"lcxx" : {
"zb" : "",
"szlc" : "",
"mj" : ""
},
"updateBy" : "1",
"updateTime" : "2021-08-27 11:14:31"
}

3.索引

3.1 唯一索引

 默认索引:_id(唯一性的索引)

 唯一索引会保证索引对应的键不会出现相同的值,如果唯一索引所在的字段有重复数据写入时,抛出异常。

db.getCollection("qydrmb_copy").createIndex({"qtjbxx":1},{unique:true})

3.2 单键索引

 最普通索引,不会自动创建。

 创建单建索引示例

db.getCollection("qydrmb_copy").createIndex({"qtjbxx":1})

db.getCollection("qydrmb_copy").createIndex({"qtxx.fwcqdw":1})

注意

  • ​ qydrmb_copy:集合名称

  • ​ qtjbxx:集合字段名

  • ​ qtxx.fwcqdw:集合中子集合字段名

  • ​ 1:升序排序

  • ​ -1:降序排序

3.3 多键索引

 多键索引和单键索引创建形式一样,区别:字段的值,值具有多个记录,如,数组

注意:通过 getIndexes() 不能区分该索引是单键索引还是多键索引,可以 explain() 执行计划的打印信息中查看(isMultKey 属性)

3.4 复合索引

 复合索引针对多个字段联合创建索引,先按照第一个字段排序,第一个字段相同的文档按照第二个字段排序,依次类推。

 语法:

db.collection_name.createIndex({索引键名:排序规则, 索引键名:排序规则, ...})

 复合索引能满足的查询场景比单字段索引更丰富,不光能满足多个字段组合起来的查询,也能满足所有能匹配符合索引前缀的查询。

注意:创建一个复合索引 A、B, 查询条件中包含A,B会走索引,查询条件中包含A,也会走索引,查询条件中没有A,只有一个B,此时不会走索引。A就称为索引前缀。

3.5 交叉索引

 交叉索引就是为了一个集合的多个字段分别建立索引,在查询的时候通过多个字段作为查询条件,这种情况称为交叉索引。

 交叉索引和复合索引区别:交叉索引 A、B是两个索引,复合索引中 A、B组成了一个索引。

注意:一个集合中包含交叉索引A、 B,在查询条件中包含A、或者包含B、或者包含A、B的情况下,都会触发交叉索引。

3.6 部分索引

 部分索引是针对符合某个特定条件的文档建立索引,3.2版本才支持该特性。

 MongoDB 部分索引只为那些在一个集合中,满足指定的筛选条件的文档创建索引。简单理解就是部分索引是带有过滤条件的索引,即索引只存在于某些文档之上

​ 语法:

db.collection_name.createIndex({索引键名:排序规则},{partialFilterExpression:{"前面进行排序的键名":{匹配条件:条件值}}})

注意:部分索引和唯一所以一块使用,唯一约束只适用于满足筛选条件的文档。

3.7覆盖索引

 1.所有的查询字段是索引的一部分

 2.查询返回的所有字段在同一个索引中

例如:如果一个索引中包含A、B 两个字段,查询条件只有一个A, 返回结果为 A、B两个字段,则此时会触发覆盖索引,即不再扫描整个文档,而是直接从索引中获取数据。

3.8 全文索引

 全文检索对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。

 MongoDB 从 2.4 版本开始支持全文检索,目前支持15种语言的全文索引(danish、dutch、english、finnish、french、german、hungarian、italian、norwegian、portuguese、romanian、russian、spanish、swedish、turkish)。

 mongo2.6之后默认开启全文检索。

创建语法:

db.collection_name.ensureIndex({全文索引的字段名:"text"})

查询语法:

db.collection_name.find({$text:{$search:"检索的值"}})

4.索引限制

4.1 查询限制

  • 索引不能被以下查询使用:

  • 正则表达式(最左匹配除外)及非操作符,如$nin,$not等

  • 算数运算符,如 $mod 等。

  • 可以使用explain()来查看是否执行了索引

4.2 范围限制

  • 集合中索引不能超过64个

  • 索引名的长度不能超过128个字符

  • 一个符合索引最多可以有31个字段

  • 索引的大小不能超过内存的限制,如果超出限制,Mongo会删除一些索引,会导致性能下降。

MongoDB索引的简单理解的更多相关文章

  1. 关于MongoDB的简单理解(二)--Java篇

    一.声明 本文依赖于 MongoDB JVM DRIVERS 4.1 版本编写. 本文案例依赖于 Maven 项目管理工具. 二.本文主要讲解哪些内容? 如何连接到MongoDB 通过TLS/SSL连 ...

  2. MongoDB 索引篇

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

  3. git的简单理解及基础操作命令

    前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制管理>这本书(偏理论,内容完善,很不错),针对所学 ...

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

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

  5. MongoDB索引的种类与使用

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

  6. MongoDB索引原理

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

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

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

  8. 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制

    [原创]分布式之数据库和缓存双写一致性方案解析(三)   正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...

  9. input屏蔽历史记录 ;function($,undefined) 前面的分号是什么用处 JSON 和 JSONP 两兄弟 document.body.scrollTop与document.documentElement.scrollTop兼容 URL中的# 网站性能优化 前端必知的ajax 简单理解同步与异步 那些年,我们被耍过的bug——has

    input屏蔽历史记录   设置input的扩展属性autocomplete 为off即可 ;function($,undefined) 前面的分号是什么用处   ;(function($){$.ex ...

随机推荐

  1. Windows协议 Kerberos篇

    认证流程 角色 功能 Domain Controller 也就是域控 Key Distribution Center 秘钥分发中心,简称KDC,默认安装在域控里,包括AS.AD和TGS. Accoun ...

  2. 为数不多的人知道的 Kotlin 技巧及解析

    文章中没有奇淫技巧,都是一些在实际开发中常用,但很容易被我们忽略的一些常见问题,源于平时的总结,这篇文章主要对这些常见问题进行分析. 这篇文章主要分析一些常见问题的解决方案,如果使用不当会对 性能 和 ...

  3. 做Android开发怎么才能不被淘汰?

    1.Jetpack架构组件从入门到精通 Android Jetpack - Navigation Android Jetpack - Data Binding Android Jetpack - Vi ...

  4. OEM 刷新配置方法

    一:设置>添加目标>配置自动搜索 二:主机上的目标>针对所选的主机 三:禁用调度 四:设置>添加目标>自动搜索结果 五:主机上的目标,搜索结果 六:删除 七:选择机器数据 ...

  5. 使用Cobertura做代码覆盖率测试

    经验总结:首先要把cobertura.jar包含ant的classpath路径中,其次要求它包含在测试用例的classpath中: 使用cobertura做代码覆盖率测试中出现的问题:覆盖率始终为0, ...

  6. 多台虚机redis cluster集群

    用到的安装包 https://pan.baidu.com/s/1wwLm3C7oWcM9ptwMjRltGA 提取码:vdfp 系统环境:centos7 ----------------------- ...

  7. WPS:利用数据透视表将数据按指定列进行分组求和

    1.场景 如图所示:根据日期计算日期当天的总金额 2.利用数据透视表完成该操作 (1)选择金额列的某一格数据,点击上方插入--数据透视表 !!请确保表格第一行为表头 (2)在弹出的页面中直接点击&qu ...

  8. 优化 SQL 语句的步骤

    优化 SQL 语句的步骤 1.分析MySQL服务器当前的状态信息 SHOW SESSION STATUS; SHOW SESSION STATUS LIKE 'Com_%' //当前会话下所有语句类型 ...

  9. SpringBoot启动异常 Process finished with exit code 1

    记录一下一个报错 : < Springboot项目启动之后直接 Process finished with exit code 1 1. 是否有spring-boot-starter-web依赖 ...

  10. 接入华为应用内支付,验证购买Token接口,返回“rights invalid”

    有海外开发者向我们提问:我在应用中集成了华为应用内支付SDK(测试购买订阅型商品),按照文档说明,在服务器去请求验证购买Token接口的时候返回了{"responseCode":& ...