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本地挂载HDFS

    1.修改配置文件 进入配置文件目录: cd ${HADOOP_HOME}/etc/hadoop 修改core-site.xml: vim core-site.xml 在文件中增加以下内容: <p ...

  2. Run Clojure Script with External Dependencies without leiningen

    The normal way of deploy clojure files is using leiningen. But if we have no leiningen, or the scrip ...

  3. NOIP 模拟 $30\; \rm 毛二琛$

    题解 \(by\;zj\varphi\) 原题问的就是对于一个序列,其中有的数之间有大小关系限制,问有多少种方案. 设 \(dp_{i,j}\) 表示在前 \(i\) 个数中,第 \(i\) 个的排名 ...

  4. Java之Spring基础与IoC

    Spring About Spring 开源免费框架,轻量级,非入侵式框架.Spring就是一个轻量级的控制反转(IOC)和面向切片编程(AOP)的框架 Maven repo:Spring Web M ...

  5. JdbcTemplateUtils

    package com.meeno.common.utils; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.J ...

  6. C# 如何在编译时将 dll 复制到 bin\Release 目录下

    下面假设 Project 名为 Gamma4RTD,需要调用的 dll 文件为 rtddll.dll.IDE 是 Visual Studio 2015 打开 Visual Studio 2015 -& ...

  7. yield 关键字的认知

    namespace ConsoleDemo{ class Program { static void Main(string[] args) { string[] str = { "1&qu ...

  8. C++ 矩形交集和并集的面积-离散化

    //离散化,x,y坐标分别按从小到大排序 //离散化 //1.首先分离出所有的横坐标和纵坐标分别按升序存入数组X[ ]和Y[ ]中. //2. 设数组XY[ ][ ].对于每个矩形(x1,y1)(x2 ...

  9. C语言定义常量

     /* #define 标识符 #define day main中day=10;仅一次赋值*/        错误 #define 标识符 常量值 #define day 10;

  10. jQuery中的表单过滤选择器(四、七)::input、:text、:password、:radio、:checkbox、:file等

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...