您当前的位置:首页 > 电脑百科 > 数据库 > 百科

MongoDB索引使用总结

时间:2024-04-17 12:27:39  来源:  作者:视角先锋队

MongoDB索引使用总结

MongoDB 是目前最流行的文档型数据库。MongoDB 的采用类 json 的存储格式对开发者来说非常友好。本文梳理了 MongoDB 索引的底层结构以及使用经验,不足之处欢迎大家指正。

背景

MongoDB 提供范围广泛的索引类型和功能以及特定于语言的排序顺序,以支持对数据的复杂访问模式。 MongoDB 索引可以按需创建和删除来适应不断变化的应用程序需求和查询模式,并且可以在文档中的任何字段上声明,包括嵌套在数组中的字段。本文介绍一下 MongoDB 中的索引底层结构、索引遍历过程、建索引以及如何使用。

基本使用

分类

MongoDB 中的索引与其他数据库系统中的索引类似。 MongoDB 在集合级别定义索引,并支持 MongoDB 集合中文档的任何字段或子字段的索引。 常见的有以下类型: 键索引、复合索引、多键索引、地理空间索引、全文本索引和哈希索引。

创建/删除/隐藏

  1. MongoDB 使用 createIndex 方法来创建索引:`db.collection.createIndex(keys, options)`

    语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。`db.col.createIndex({"a":1})`

    createIndex 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。db.col.createIndex({"a":1,"b":-1})

  1. 删除索引:db.collection.dropIndex

    删除索引在底层直接删除文件,然后修改元数据

  1. 从 4.4 开始支持隐藏索引db.collection.hideIndex()

    在删除索引前,可以先隐藏索引,查看集群是否异常后,才真正删除索引, 可有效帮助业务判断索引是否可以删除。

数据结构

底层文件存储

MongoDB 底层是如何存储数据的,一个 collection 一个文件吗?索引在底层是如何组织的? 一个 collection 对应到底层存储引擎就是一个文件,另外每个索引也是单独的文件,每个数据和索引文件的默认结构是 b 树,用户建表的时候也可以指定 lsm 结构,不过绝大多数用户基本都是使用 b 树结构,本文的讨论主要围绕 b 树这种结构来进行。

比如用户建一个普通的表,默认会带一个_id 索引,会产生俩个文件,一个文件存放数据,一个存放_id 索引,这俩个文件通过 RecordId 来连接,用户每插入一条数据,mongo 会生成一条与之对应的自增的 RecordId, 不过用户不感知,RecordId 是与 MySQL 中的自增主键类似。数据文件是 RecordId 到数据的映射, _id 索引文件是_id 到 RecordId 的映射,如果通过指定_id 查询,会现在_id 索引文件中找到 RecordId, 然后再到数据文件中查询数据,如果用户再新建索引,那么在 wt 就会再新建一个文件,同样按 b 树组织,该文件记录了索引到 RecordId 的映射,用户使用索引查询时,同样的如同_id 索引,先找到 RecordId, 然后再到数据文件中查询数据。

可以通过以下方式查找数据对应的RecordId PRIMARY> db.coll.find.showRecordId { "_id" : ObjectId("647861f72b531acaacf4afb2"), "a" : 1, "b" : 1, "$recordId" : NumberLong(1) } { "_id" : ObjectId("647861fa2b531acaacf4afb3"), "a" : 1, "b" : 2, "$recordId" : NumberLong(2) }

底层格式存储

在 MongoDB 的 Schema-free 架构下,索引字段可以存储不同类型的值,在索引 b 树中,有个基本的问题,实现不同类型的比较呢? MongoDB 通过 BSON 结构来存储数据,具体结构的解析可见BSON 结构解析 ,并且规定了不同类型之间的大小关系。

1. MinKey (internal type) 2. Null 3. Numbers (ints, longs, doubles, decimals) 4. Symbol, String 5. Object 6. Array 7. BinData 8. ObjectId 9. Boolean 10. Date 11. Timestamp 12. Regular Expression 13. MaxKey (internal type)

在这个限制下, 就只需要对比同种类型的大小了,BSON 的基本比较流程如下:先比较类型,如果类型一样才使用 BSONElement::compareElements 比较值。

但是对于索引如果直接使用上述方法去做大小比较,具有以下的俩个缺点:



Tags:MongoDB   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
线上MongoDB查询慢,如何通过索引优化直降响应时间?
作者 | 吴守阳审校 | 重楼背景线上某个页面的响应速度异常缓慢,达到了16秒,严重影响了业务的正常运行。经过与研发的沟通得知,该页面调用的数据集合只会保留7天的数据,集合有600...【详细内容】
2024-04-29  Search: MongoDB  点击:(0)  评论:(0)  加入收藏
MongoDB索引使用总结
MongoDB索引使用总结MongoDB 是目前最流行的文档型数据库。MongoDB 的采用类 json 的存储格式对开发者来说非常友好。本文梳理了 MongoDB 索引的底层结构以及使用经验,不足之...【详细内容】
2024-04-17  Search: MongoDB  点击:(0)  评论:(0)  加入收藏
MongoDB 大量数据插入时的性能影响及解决方法
MongoDB 是一种广泛应用的 NoSQL 数据库,以其高度可扩展性和灵活性而闻名。然而,在处理大量数据时,MongoDB 的性能可能会受到一些影响。大量数据插入对 MongoDB 性能的影响磁盘...【详细内容】
2024-01-05  Search: MongoDB  点击:(140)  评论:(0)  加入收藏
Java操作MongoDB如何批量写入数据
当需要插入、更新或删除大量文档时,一次执行多个操作比分别执行每个操作要快得多。批量操作减少了网络往返次数,减少了I/O负载,并且可能允许数据库引擎更有效地利用内部缓存和...【详细内容】
2023-12-19  Search: MongoDB  点击:(103)  评论:(0)  加入收藏
解析MongoDB的并发控制和事务隔离级别:保证数据一致性
MongoDB 是一个高性能的文档型数据库,支持多维度的并发控制和事务隔离级别,以保证数据一致性。接下来,下面将详细讲解 MongoDB 的并发控制和事务隔离级别。一、并发控制MongoDB...【详细内容】
2023-12-19  Search: MongoDB  点击:(108)  评论:(0)  加入收藏
MongoDB与大数据处理:构建高性能分布式数据库
MongoDB是一种非关系型数据库,具有高度灵活性和可扩展性。在处理大量数据时,索引的优化是提升查询性能的关键。下面将介绍一些MongoDB索引优化的指南,帮助用户更好地利用索引来...【详细内容】
2023-12-18  Search: MongoDB  点击:(75)  评论:(0)  加入收藏
MongoDB索引优化指南:提升查询性能的关键
MongoDB是一种非关系型数据库,具有高度灵活性和可扩展性。在处理大量数据时,索引的优化是提升查询性能的关键。下面将介绍一些MongoDB索引优化的指南,帮助用户更好地利用索引来...【详细内容】
2023-12-14  Search: MongoDB  点击:(127)  评论:(0)  加入收藏
Mongodb和Elasticsearch计算经纬度哪个性能更好
MongoDB和Elasticsearch都支持计算经纬度距离,但它们的性能表现可能因使用场景和数据规模而异。性能对比1、数据索引和存储 MongoDB使用地理空间索引(2dsphere)来支持经纬度数...【详细内容】
2023-12-11  Search: MongoDB  点击:(251)  评论:(0)  加入收藏
解密MongoDB集群管理:构建高可用性数据库架构
MongoDB集群管理是指在MongoDB数据库环境中构建高可用性的数据库架构,以确保数据的持久性、可用性和性能。下面将详细介绍构建高可用性数据库架构的相关概念、方法和步骤。一...【详细内容】
2023-12-06  Search: MongoDB  点击:(155)  评论:(0)  加入收藏
Java和MongoDB的异常检测
构建实时监控和告警系统是当今许多企业和组织所需要的关键功能之一。Java和MongoDB的异常检测是这样的一个监控系统中的重要组成部分。下面将详细介绍如何使用Java和MongoDB...【详细内容】
2023-11-23  Search: MongoDB  点击:(218)  评论:(0)  加入收藏
▌简易百科推荐
线上MongoDB查询慢,如何通过索引优化直降响应时间?
作者 | 吴守阳审校 | 重楼背景线上某个页面的响应速度异常缓慢,达到了16秒,严重影响了业务的正常运行。经过与研发的沟通得知,该页面调用的数据集合只会保留7天的数据,集合有600...【详细内容】
2024-04-29    51CTO  Tags:MongoDB   点击:(0)  评论:(0)  加入收藏
MongoDB索引使用总结
MongoDB索引使用总结MongoDB 是目前最流行的文档型数据库。MongoDB 的采用类 json 的存储格式对开发者来说非常友好。本文梳理了 MongoDB 索引的底层结构以及使用经验,不足之...【详细内容】
2024-04-17  视角先锋队    Tags:MongoDB   点击:(0)  评论:(0)  加入收藏
向量数据库落地实践
本文基于京东内部向量数据库vearch进行实践。Vearch 是对大规模深度学习向量进行高性能相似搜索的弹性分布式系统。详见: https://github.com/vearch/zh_docs/blob/v3.3.X/do...【详细内容】
2024-04-03  京东云开发者    Tags:向量数据库   点击:(15)  评论:(0)  加入收藏
原来 SQL 函数是可以内联的!
介绍在某些情况下,SQL 函数(即指定LANGUAGE SQL)会将其函数体内联到调用它的查询中,而不是直接调用。这可以带来显著的性能提升,因为函数体可以暴露给调用查询的规划器,从而规划器...【详细内容】
2024-04-03  红石PG  微信公众号  Tags:SQL 函数   点击:(11)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28    51CTO  Tags:NoSQL   点击:(24)  评论:(0)  加入收藏
为什么数据库连接池不采用 IO 多路复用?
这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以...【详细内容】
2024-03-27  dbaplus社群    Tags:数据库连接池   点击:(23)  评论:(0)  加入收藏
八个常见的数据可视化错误以及如何避免它们
在当今以数据驱动为主导的世界里,清晰且具有洞察力的数据可视化至关重要。然而,在创建数据可视化时很容易犯错误,这可能导致对数据的错误解读。本文将探讨一些常见的糟糕数据可...【详细内容】
2024-03-26  DeepHub IMBA  微信公众号  Tags:数据可视化   点击:(16)  评论:(0)  加入收藏
到底有没有必要分库分表,如何考量的
关于是否需要进行分库分表,可以根据以下考量因素来决定: 数据量和负载:如果数据量巨大且负载压力较大,单一库单一表可能无法满足性能需求,考虑分库分表。 数据增长:预估数据增长...【详细内容】
2024-03-20  码上遇见你  微信公众号  Tags:分库分表   点击:(28)  评论:(0)  加入收藏
在 SQL 中写了 in 和 not in,技术总监说要炒了我……
WHY?IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?1、效率低项目中遇到这么个情况:t1表 和 t2表 都是150w条数据,600M的样子,都不算大。但是这样一句查询 ↓select *...【详细内容】
2024-03-18  dbaplus社群    Tags:SQL   点击:(22)  评论:(0)  加入收藏
应对慢SQL的致胜法宝:7大实例剖析+优化原则
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什...【详细内容】
2024-03-14  京东云开发者    Tags:慢SQL   点击:(17)  评论:(0)  加入收藏
站内最新
站内热门
站内头条