MongoDB 索引全攻略

这篇具有很好参考价值的文章主要介绍了MongoDB 索引全攻略。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、索引介绍

        1.1 单字段索引

        1.2 复合索引

        1.3 多键索引

        1.4 主键索引

        1.5 TTL 索引

        1.6 地理空间索引

        1.7 哈希索引

        1.8 创建索引时注意事项

        1.9 索引效果查看

 二、索引实现原理

        2.1 为什么使用 B-Tree

三、执行计划


一、索引介绍

        任何数据库都有索引这一核心功能,索引通常能够极大的提高查询效率,如果没有索引,MongoDB 在读取数据时必须扫描集合中的每个文件,并选取那些符合查询条件的记录。

        这种扫描查询集合的查询方式效率非常低,特别在处理大量数据时。索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。

        使用索引通常有如下的作用:

  • 加速查询:通过索引,数据库能够快速定位到符合条件的文档,避免全表扫描,大大减少查询响应时间。
  • 排序优化:索引可用于高效地对查询结果进行排序,无需在内存中对大量数据进行排序操作。
  • 覆盖查询:当索引包含了查询所需的所有字段时,数据库可以直接从索引中获取全部数据,无需访问文档本身,减少了磁盘 I/O。
  • 唯一性约束:创建唯一索引可以确保集合中指定字段的值唯一,防止插入重复数据。

        在 MongoDB 中有很多种索引,下面分别看下不同的索引。

        1.1 单字段索引

        在单个字段上建立的索引,对于单字段索引和排序操作,索引键的排序顺序无关紧要,因为MongoDB 可以在任意方向遍历。

// users 为 collection,创建 username 索引
db.users.createIndex({username: 1})

mongo 创建索引,MongoDB,mongodb,数据库,MongoDB执行计划,MongoDB索引优化        

        1.2 复合索引

        多个字段的自定义索引,即复合索引。复合索引中的字段顺序很重要。例如,如果复合索引由{ userid: 1, score: -1} 组成,则索引首先按userid排序,然后在每个userid值内按score排序。在查询时可以按照userid:1,score:-1或者userid:-1,score:1查询,因为这两个顺序和树的组成顺序完全相同,相反执行userid:-1,score:-1将不会使用索引。

mongo 创建索引,MongoDB,mongodb,数据库,MongoDB执行计划,MongoDB索引优化

        1.3 多键索引

        MongoDB 使用多键索引来索引存储在数组中的内容。如果索引一个包含数组值的字段,MongoDB 会为数组的每个元素创建单独的索引条目。这些多键索引允许查询通过匹配数组的一个或多个元素来选择包含数组的文档。如果索引字段包含数组值,MongoDB 会自动判断是否创建多键索引;你不需要明确指定多键类型。

mongo 创建索引,MongoDB,mongodb,数据库,MongoDB执行计划,MongoDB索引优化

        1.4 主键索引

        MongoDB 中默认为 _id 字段且不能更改,用于维护聚簇索引树。每个集合都有一个默认的索引:“_id”索引,它是一个特殊的字段,用来唯一标识集合中的每个文档。这个字段通常被用作查询文档的主键,并且MongoDB会自动为其创建一个唯一索引。

        1.5 TTL 索引

        类似于 Redis 的过期时间,为一个字段创建TTL索引后,超时会自动删除整个文档。TTL索引适用于那些具有有效期、需要定期清理过期数据的场景,如会话记录、日志条目、临时消息等。

db.event_log.createIndex({timestamp: 1}, {expireAfterSeconds: 604800})  // 604800秒 = 7天

        1.6 地理空间索引

        特别针对地理空间数据设计的索引,如2dsphere索引用于处理经纬度坐标,支持地理位置查询(如距离计算、边界框查询等)。其他地理空间索引类型包括2d(用于平面坐标)和geoHaystack(已弃用)。

        1.7 哈希索引

        将索引字段的值通过哈希函数计算出哈希值进行索引,适用于等值查询,但不支持范围查询和排序。

        1.8 创建索引时注意事项

        在创建索引时不要过多添加,虽然索引可以有效的提升查询性能,但过多的索引会增加写入成本、占用更多的存储空间,并可能使查询优化器的选择变得复杂。

        创建索引时可能会存在锁表,需要根据具体使用的版本而定。4.2及以上版本在创建索引过程中,仅在索引构建的开始和结束时持有排他锁,构建过程中的其余部分产生交错读取和写入操作。建议在业务低峰期添加索引。

        1.9 索引效果查看

        索引创建后,到底所创建索引的效果如何呢?可以通过一下方式验证,具体就是查看所以的区分度,类似于 MySQL 的 Cardinality。所得的值越接近1说明区分度越高,索引效果越好,

// 索引字段去重后的数量 / 集合的总量
db.collection.distinct("field").length/db.collection.count()

 二、索引实现原理

        MongoDB 是文档型数据库,使用 BSON 格式保存数据,比关系型数据库存储更方便。MySQL 是关系型数据库,数据的关联性非常强,区间访问是常见的一种场景,底层索引组织数据使用B+树,B+树由于数据全部存储在叶子节点,并且通过指针串在一起,这就很容易进行区间遍历甚至全部遍历。

        MongoDB 采用 B-tree 作为其索引的主要数据结构。B-tree 是一种自平衡的多路搜索树。

        自平衡:无论数据如何插入或删除,树的高度始终保持相对稳定,从而保证查询效率接近O(log N),其中N是集合中文档的数量。

        多路分支:每个节点可以有多个子节点,具体数量取决于 B-tree 的阶数。高阶 B-tree 可以更有效地利用磁盘块,减少磁盘 I/O 次数。

        有序存储:B-tree 节点中的键值对按照索引字段的排序规则(升序或降序)排列,便于快速定位和范围查询。

        2.1 为什么使用 B-Tree

        B-Tree 和 B+Tree 都是树形数据结构,用于在数据库中存储和查找数据。它们的主要区别在于数据的存储方式和查找效率。

        B-Tree 的每个节点都包含键和值,所有的键值对都存储在树的内部节点和叶子节点中。这意味着一旦找到了正确的节点,就可以立即获取到对应的值,无需进一步的磁盘 I/O 操作。

        而 B+Tree 只在叶子节点中存储键值对,内部节点只存储键。这意味着查找值时,即使找到了正确的内部节点,还需要进一步查找叶子节点才能获取到值,可能需要额外的磁盘 I/O 操作。

三、执行计划

        MongoDB执行计划(Execution Plan)是描述 MongoDB 如何执行一条查询语句的详细过程和策略,它提供了关于查询优化器如何选择索引、如何访问数据、执行成本估计等方面的详细信息。通过分析执行计划,可以深入了解查询性能、识别潜在的优化点以及调试查询性能问题。

        执行计划语句

db.collection.find({field: value}).explain('verbosity')

        使用 explain()方法附加在查询语句后面来获取执行计划。explain()接受一个可选的verbosity 参数,用来指定返回的执行计划详细程度:    

  • queryPlanner(默认):提供查询计划的基本信息,包括查询类型、候选索引、选定索引及其原因、查询阶段等。
  • executionStats:除了查询计划基本信息外,还包括实际执行时的统计信息,如扫描的文档数、返回的文档数、执行时间、索引使用情况等。
  • allPlansExecution:除了上述信息外,还会实际执行所有候选索引并返回各自的执行统计,有助于对比不同索引的性能。

        执行计划中需要重点关注:COLLSCAN、IXSCAN、keysExamined、docsExamined等关键字。

  • COLLSCAN:代表该查询进行了全表扫描
  • IXSCAN:代表进行了索引扫描
  • keysExamined:代表索引扫描条目
  • docsExamined:代表文档扫描条目

        根据执行计划分析结果,可能要采取不同的优化策略,比如:创建或调整索引、优化查询条件、使用覆盖索引等。

        综上所述,MongoDB 执行计划提供了深入理解查询执行过程和优化查询性能的关键信息。通过解读执行计划的各部分、对比不同计划、分析统计信息,可以针对性地调整索引策略、优化查询语句或调整查询选项,从而提升查询效率。结合使用相关工具和命令,可以实现对查询性能的持续监控和调优。

往期经典推荐:

全面解读MongoDB高可用、高性能与高可扩展架构-CSDN博客

深入剖析MongoDB集群架构设计-CSDN博客

TiDB存储引擎TiKV揭秘-CSDN博客

揭开Spring Bean生命周期的神秘面纱-CSDN博客

决胜微服务架构:OpenFeign轻量级REST客户端的魅力解析_feign配置loadbalancer-CSDN博客文章来源地址https://www.toymoban.com/news/detail-860334.html

到了这里,关于MongoDB 索引全攻略的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 新手搭建服装小程序全攻略

    随着互联网的快速发展,线上购物已经成为了人们日常生活中不可或缺的一部分。服装作为人们日常消费的重要品类,线上化趋势也日益明显。本文将详细介绍如何从零开始搭建一个服装小程序商城,从入门到精通的捷径,帮助你快速掌握小程序商城的制作方法和技巧。 首先

    2024年02月21日
    浏览(43)
  • Github搭建个人博客全攻略

    Github是开发者的代码仓库,一个开源和分享社区。 本文前提是已注册github账号。 假设用户名为MyName 进入个人主页(https://github.com/用户名),选择Repositories,点击New Repository name填入MyName.github.io,即MyName/ MyName.github.io ,点击Create Repository 安装Git或TortoiseGit(后者添加环境变量)

    2024年02月16日
    浏览(56)
  • Jenkins 插件安装方式全攻略

    在Jenkins 的安装向导页面中, 会有一步是否安装推荐的插件, 可以直接进行安装, 也可以跳过。 对于安装机器联网的状况, 安装插件相对方便,直接搜索插件安装, 但是也可能会出现无法在线安装的状况, 原因解析及解决方法 参考: Jenkins 在Windows下插件无法安装问题解

    2023年04月21日
    浏览(63)
  • 谷歌账号注册流程全攻略

    一、访问谷歌账号注册页面 首先,你需要访问谷歌账号注册页面。你可以直接点击此链接,或者在谷歌首页点击右上角的“登录”按钮,在弹出的登录框中点击“创建帐号”。 在注册页面,你需要填写以下个人信息: 名字:输入你的名字。 姓氏:输入你的姓氏。 用户名:

    2024年02月05日
    浏览(51)
  • TortoiseSVN源码安装与迁移全攻略

    一、前言 随着版本控制系统的普及,越来越多的开发者和团队开始使用SVN(Subversion)来管理代码。本文将详细介绍TortoiseSVN的源码安装及迁移过程,帮助您轻松掌握这一版本控制工具。 二、TortoiseSVN源码安装 依赖环境安装,apr、apr-util、zlib、sqlite apr 环境   apr-util 环境 zl

    2024年01月24日
    浏览(52)
  • 开发巴西市场全攻略,外贸人收藏

    巴西联邦共和国位于南美洲东部,是南美洲资源最丰富,经济活力和经济实力最强的国家。巴西作为拉丁美洲的出口大国,一直是一个比较有潜力的市场,亦是我国外贸公司和独立外贸人集群的地方。 2021年巴西贸易概况 ✦ 1、2021年巴西贸易创纪录 2021年,巴西的对外贸易以

    2024年02月05日
    浏览(55)
  • kaggle免费服务器全攻略

    1. kaggle服务器16G显卡一周40小时. 所以我们直接干一堆谷歌账号即可 2. 谷歌账号的注册: 我们需要FQcolab for windows可以做到. 然后我们注册好账号后.我们注册4个账号. 注册方法. 打开chrome   点最下面的添加按钮.然后一直下一步即可.无脑注册. 3.  为Chrome多账户添加单独的快捷方

    2024年02月16日
    浏览(43)
  • SuperMap iObjects Docker打包全攻略

    说明 此教程编写时使用的iObjects版本为 10.2.1 ,理论高版本同样支持,具体自测。 基础镜像为 Docker 官方 ubuntu:16.04完整版 。(想换alpine自己折腾) 不同CPU架构都需要 重新打包 Dockerfile以安装相关LIB库(本教程以x64为例) 容器内部默认使用超图iObjects完整包内 自带的JRE (10

    2024年02月02日
    浏览(40)
  • 前端使用Cesium加载三维模型全攻略

    想象一下,地球在你眼前旋转,上面还有各种3D模型,是不是很酷?Cesium是一个超酷的库,专门用来创建超炫的3D地球和地图。好,言归正传,今天这篇文章就分享一下前端如何使用Cesium加载三维模型。 首先,确保你已经安装了Cesium库。可以从Cesium官网下载最新版本的库文件

    2024年04月17日
    浏览(42)
  • HTML编写渐变色动画登录页面全攻略

    想要打造炫酷的登录页面吗?那么必须要学会如何用HTML编写渐变色动画效果。本文将为你详细介绍HTML渐变色动画的原理、示例代码以及调试技巧,让你轻松掌握这项必备技能。 渐变色动画原理 渐变色动画是指在网页中使用渐变色呈现动态效果,通常用于按钮、背景等元素上

    2024年02月07日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包