关于对MongoDB索引的一些简单理解

目录
  • 索引简介
  • 1.语法准备
  • 2.数据准备:
  • 3.索引
    • 3.1 唯一索引
    • 3.2 单键索引
    • 3.3 多键索引
    • 3.4 复合索引
    • 3.5 交叉索引
    • 3.6 部分索引
    • 3.7覆盖索引
    • 3.8 全文索引
  • 4.索引限制
    • 4.1 查询限制
    • 4.2 范围限制
  • 总结

索引简介

索引可以提升文档的查询速度,但建立索引的过程需要使用计算与存储资源,在已经建立索引的前提下,插入新的文档会引起索引顺序的重排。

MongoDB 的索引是基于 B-tree 数据结构及对应算法形成的。树索引存储特定字段或字段集的值,按字段值排序。索引条目的排序支持有效的等式匹配和基于范围的查询操作。

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索引的一些简单理解的文章就介绍到这了,更多相关MongoDB索引简单理解内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mongodb处理中文索引与查找字符串详解

    参考文献 首先自打3.2版本之后,就开始支持中文索引了,支持的所有的语言参考这里: https://docs.mongodb.com/manual/reference/text-search-languages/ 然后,对于要支持索引的表需要建议text index,如何建立参考这里: https://docs.mongodb.com/manual/core/index-text/ 在建好索引text之后,如果检索参考: https://docs.mongodb.com/manual/refer

  • MongoDB自动删除过期数据的方法(TTL索引)

    前序: 最近由于公司业务需求,对于3个月前的过期数据需要进行删除动作,以释放空间和方便维护 本来想的是使用crontab写个脚本定时执行,但是看到Mongo本身就有自动删除过期数据的功能,所以还是用一下吧 这个方法就是使用TTL索引,后续我再写一个脚本定时删除的任务,关于TTL索引的更多使用实例,大家可以参考学习这篇文章:https://www.jb51.net/article/126810.htm 介绍: TTL索引是MongoDB中一种特殊的索引, 可以支持文档在一定时间之后自动过期删除,目

  • MongoDB查询字段没有创建索引导致的连接超时异常解案例分享

    今天在现场的哥们发来异常,让我解决,错误信息如下: 复制代码 代码如下: HTTP Status 500 - Read operation to server 192.168.1.110:20001 failed on database wpdb; nested exception is com.mongodb.MongoException$Network: Read operation to server 192.168.1.110:20001 failed on database wpdb

  • MongoDB索引使用详解

    索引就像书的目录,如果查找某内容在没有目录的帮助下,只能全篇查找翻阅,这导致效率非常的低下:如果在借助目录情况下,就能很快的定位具体内容所在区域,效率会直线提高. 索引简介 首先打开命令行,输入mongo.默认mongodb会连接名为test的数据库. ➜ ~ mongo MongoDB shell version: 2.4.9 connecting to: test > show collections > 可以使用show collections/tables查看数据库为空. 然后在mon

  • MongoDB中唯一索引(Unique)的那些事

    写在前面 MongoDB支持的索引种类很多,诸如单键索引,复合索引,多键索引,TTL索引,文本索引,空间地理索引等.同时索引的属性可以具有唯一性,即唯一索引.唯一索引用于确保索引字段不存储重复的值,即强制索引字段的唯一性.缺省情况下,MongoDB的_id字段在创建集合的时候会自动创建一个唯一索引.本文主要描述唯一索引的用法. 关于什么是索引以及唯一索引这里就不做说明了,不清楚的可以自行谷歌或者百度.是什么引起我写这篇文章呢,这来自于之前项目中的一个问题. 我们用的是MongoDB数据存储用户信

  • 关于MongoDB索引管理-索引的创建、查看、删除操作详解

    索引是提高查询查询效率最有效的手段.索引是一种特殊的数据结构,索引以易于遍历的形式存储了数据的部分内容(如:一个特定的字段或一组字段值),索引会按一定规则对存储值进行排序,而且索引的存储位置在内存中,所在从索引中检索数据会非常快.如果没有索引,MongoDB必须扫描集合中的每一个文档,这种扫描的效率非常低,尤其是在数据量较大时. 1. 创建/重建索引 MongoDB全新创建索引使用ensureIndex()方法,对于已存在的索引可以使用reIndex()进行重建. 1.1 创建索引ensureI

  • MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划

    一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口并不足为 奇. 1.基础索引 在字段age 上创建索引,1(升序);-1(降序): db.users.ensureIndex({age:1}) _id 是创建表的时候自动创建的索引,此索引是不能够删除的.当

  • MongoDB的基础查询和索引操作方法总结

    查询操作 1.查询所有记录 db.userInfo.find(); 相当于: select* from userInfo; 2.查询去掉后的当前聚集集合中的某列的重复数据 db.userInfo.distinct("name"); 会过滤掉name中的相同数据 相当于: select disttince name from userInfo; 3.查询age = 22的记录 db.userInfo.find({"age": 22}); 相当于: select * f

  • MongoDB中创建索引需要注意的事项

    上周在 ruby-china 上发了帖子<MongoDB 那些坑>,反映相当热烈,许多回复很有见地,其中一位童鞋深入的提到 MongoDB 建索引方法的问题,引发我更深入的了解了 MongoDB 建索引的方法和一些注意事项. 在 <MongoDB 那些坑>中提到,在前台直接运行建立索引命令的话,将造成整个数据库阻塞,因此索引建议使用 background 的方式建立.但是这也会带来一定的问题,在 2.6 版本之前,在 secondary server 中即使使用 backgroun

  • 深入理解MongoDB的复合索引

    为什么需要索引? 当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下MongoDB里的索引机制(同样适用于其他的数据库比如mysql). mongo-9552:PRIMARY> db.person.find() { "_id" : ObjectId("571b5da31b0d530a03b3ce82"), "name" : "jack", "age" :

随机推荐