MongoDB:索引

目录

1、索引数据结构:B-树

2、索引类型

2.1 单字段索引

2.2 复合索引(最重要!)

2.3 多键索引(数组字段)

2.4 地理空间索引

2.5 全文索引

2.6 哈希索引(分片专用)

2.7 TTL 索引(自动过期)

3、索引管理操作

3.1 创建索引

3.2 查看索引

3.3 删除索引

3.4 修改索引(隐藏/重建)

4、explain分析执行计划

5、慢查询分析

5.1 开启慢查询记录

5.2 慢查询日志分析


1、索引数据结构:B-树

MongoDB使用B-树,所有节点都有Data域,只要找到指定索引就可以进⾏访问,单次查询从结构上来看要快于MySql。

2、索引类型

2.1 单字段索引

// 创建:在 age 字段升序索引
db.users.createIndex({ age: 1 }) 
  • 适用:等值查询、范围扫描(age: 25 或 age: { $gt: 30 }

2.2 复合索引(最重要!)

// 创建:先按 city 排序,再按 age 排序
db.users.createIndex({ city: 1, age: -1 })
  • 最左前缀原则
    ✅ 有效查询:{ city: "北京" }{ city: "上海", age: { $lt: 30 } }
    ❌ 无效查询:{ age: 25 }(无法命中索引)

2.3 多键索引(数组字段)

// tags 是数组字段:["sports", "music"]
db.products.createIndex({ tags: 1 })
  • 行为:为数组中的 每个元素 创建独立索引项

  • 限制:复合索引中 最多一个数组字段

2.4 地理空间索引

// 2dsphere 索引(地球球面坐标)
db.places.createIndex({ loc: "2dsphere" })

查询示例:

db.places.find({loc: {$near: {$geometry: { type: "Point", coordinates: [116.4, 39.9] },$maxDistance: 1000 // 1公里内}}
})

2.5 全文索引

db.articles.createIndex({ content: "text" })
  • 支持:多语言分词、停用词过滤

  • 搜索:db.articles.find({ $text: { $search: "mongodb tutorial" } })

2.6 哈希索引(分片专用)

db.users.createIndex({ _id: "hashed" }) // 分片键均匀分布

2.7 TTL 索引(自动过期)

// 文档在 create_time 后 3600 秒自动删除
db.logs.createIndex({ create_time: 1 }, { expireAfterSeconds: 3600 })
 

3、索引管理操作

3.1 创建索引

// 后台构建(不阻塞读写)
db.orders.createIndex({ product_id: 1 }, { background: true })

3.2 查看索引

db.collection.getIndexes()
// 输出:
[{ "v": 2, "key": { "_id": 1 }, "name": "_id_" },{ "v": 2, "key": { "city": 1, "age": -1 }, "name": "city_1_age_-1" }
]

3.3 删除索引

db.users.dropIndex("city_1_age_-1")

3.4 修改索引(隐藏/重建)

// 隐藏索引(测试性能影响)
db.coll.hideIndex("index_name")
// 重建索引(碎片整理)
db.coll.reIndex()

4、explain分析执行计划

db.orders.find({ user_id: 100 }).explain("executionStats")

注意:索引不是免费的 — 每个索引增加 10-20% 的写入开销。

explain()接收不同的参数,通过设置不同参数我们可以查看更详细的查询计划。

  • queryPlanner:queryPlanner是默认参数,具体执行计划信息参考下面的表格。
  • executionStats:executionStats会返回执行计划的一些统计信息(有些版本中和allPlansExecution等同)。
  • allPlansExecution:allPlansExecution用来获取所有执行计划,结果参数基本与上文相同。

1> queryPlanner默认参数

2> executionStats参数

理想状态:nReturned = totalKeysExamined = totalDocsExamined

stage的类型:

阶段说明优化建议
COLLSCAN全集合扫描必须添加索引
IXSCAN索引扫描检查索引效率
FETCH文档获取减少回表次数
SORT内存排序添加排序索引
LIMIT结果限制-
SKIP结果跳过避免大数据集skip
COUNT_SCAN计数扫描高效计数

5、慢查询分析

慢查询

  • 定义:执行时间超过设定阈值的操作(默认100ms)

  • 范围:包括查询、更新、删除、聚合等所有数据库操作

  • 关键指标:执行时间、扫描文档数、返回文档数、索引使用情况

5.1 开启慢查询记录

// 设置慢查询阈值(单位:毫秒)
db.setProfilingLevel(1, { slowms: 50 }) // 查看当前配置
db.getProfilingStatus()
/* 输出:
{"was": 1,"slowms": 50,"sampleRate": 1.0
}
*/
参数默认值说明生产建议
slowms100慢查询阈值(毫秒)50-100ms
sampleRate1.0采样率(1.0=记录所有慢查询)0.5(高负载系统)
profile00=关闭,1=慢查询,2=所有操作1

配置文件设置(mongod.conf):

operationProfiling:mode: slowOp               # 仅记录慢查询slowOpThresholdMs: 50      # 50ms阈值slowOpSampleRate: 0.5      # 50%采样率

5.2 慢查询日志分析

查看慢查询日志:

// 按执行时间倒序查看
db.system.profile.find().sort({ millis: -1 }).limit(5)

关键日志字段解析:

字段说明优化关注点
op操作类型(query/update/remove)高频操作类型
ns命名空间(database.collection)热点集合
millis执行时间(毫秒)>100ms需优化
keysExamined扫描索引键数量对比nreturned
docsExamined扫描文档数量过高需索引优化
nreturned返回文档数量对比keysExamined
planSummary执行计划摘要COLLSCAN需警惕
command完整命令(含查询条件)查询模式分析

慢查询特征分析:

// 分析不同操作的慢查询分布
db.system.profile.aggregate([{ $group: { _id: "$op", count: { $sum: 1 },avgTime: { $avg: "$millis" },maxTime: { $max: "$millis" }}}
])// 分析TOP慢查询集合
db.system.profile.aggregate([{ $group: { _id: "$ns", count: { $sum: 1 },queries: { $push: { query: "$command", time: "$millis" } }}},{ $sort: { count: -1 } },{ $limit: 3 }
])

之后通过4分析执行计划

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85850.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【大模型】Transformer架构完全解读:从“盲人摸象“到“通晓万物“的AI进化论

🤖 Transformer架构完全解读:从"盲人摸象"到"通晓万物"的AI进化论 —— 一位大模型探索者的技术日记 ☕ 第一章:为什么说Transformer是AI界的"蒸汽机革命"? 1.1 从RNN到Transformer:…

JavaEE:使用JMeter进行接口并发测试

一、下载与安装: 1.下载apache-jmeter-5.6.3.zip: https://jmeter.apache.org/download_jmeter.cgi 2.解压到D:\Program Files\apache-jmeter-5.6.3目录 3.添加JDK环境配置到D:\Program Files\apache-jmeter-5.6.3\bin\jmeter.bat文件开头&#xff1…

【笔记】MSYS2 的 MinGW64 环境中正确安装 Python 相关环境管理工具 (Poetry、Virtualenv、Pipenv 和 UV)

MSYS2 环境配置与 Python 项目依赖管理笔记_msys更新python-CSDN博客 【技术笔记】MSYS2 指定 Python 版本安装方案_pacman -u 安装指定版本-CSDN博客 更多关于 MSYS2 开发环境的配置,请查看往期笔记。 简介 本笔记将记录我们在 MSYS2 的 MinGW64 环境中安装 Pytho…

ubuntu添加域名解析服务器地址

在 Ubuntu 中配置域名解析主要有两种方式:静态修改 /etc/hosts 文件 和 动态修改 DNS 解析服务器配置。以下是详细操作指南: 建议优选:二、永久方案:修改 DNS 解析服务(推荐)中的方法1 一、临时方案:修改…

通过 AIOps 、生成式 AI 和机器学习实现更智能的可观测性

支持 AIOps 的理由 人工智能运维(AIOps)是将人工智能(AI)、机器学习(ML)和分析技术应用于提升 IT 运维团队日常工作的过程。简单来说,AIOps 是软件系统通过 AI 和 ML 以及相关分析技术来简化和…

【DataWhale组队学习】AI办公实践与应用

AI办公-PPT制作 1. 使用大模型制作PPT的常见流程 使用大模型生成PPT的文稿将文稿的内容喂给可以直接生成PPT的大模型,生成PPT 2. 使用大模型生成PPT文稿 我们可以先使用上一章提过的那些大模型去生成一个PPT的文稿。那根据上一章的内容,我们想要去让…

人机融合智能 | 人智交互中的机器行为设计与管理

以人工智能为代表的科学技术正在深入地塑造和改变着人类的社会、文化和经济等,在“无所不在的算法与智能”的时代,了解智能机器的行为对于设计智能行为并使其造福于人类,对于智能机器的设计者、开发者和使用者,都具有重要意义。机器行为研究从学科交叉的视角,将智能机器行为置于…

langChainv0.3学习笔记(高级篇)

目录 工具创建工具从函数创建工具tool 装饰器结构化工具 从可运行对象创建工具子类化 BaseTool如何创建异步工具处理工具错误返回工具执行的artifact 使用内置工具和工具包自定义默认工具如何使用内置工具包 使用聊天模型调用工具定义工具模式Python 函数LangChain 工具Pydanti…

UiAutomator2 与 Appium 对比分析:安卓自动化测试框架的选择指南

目录 一、基础介绍UiAutomator2Appium 二、功能对比三、架构差异UiAutomator2 架构简图:Appium 架构简图: 四、使用场景分析五、优缺点总结UiAutomator2 优点:UiAutomator2 缺点:Appium 优点:Appium 缺点: …

缺失的第一个正整数

继续每日一题 今天给大家带来一道将数组视为哈希表的算法 题目描述: 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 题目示例: 由于题目要求…

单例模式-Python示例

单例模式 单例模式(Singleton Pattern)是设计模式中一种创建型模式,广泛应用于软件开发中。一以下以故事化的方式,结合详细的技术讲解,介绍单例模式的背景、定义、适用场景,并提供python的示例代码。 故事…

啥是 SaaS

https://www.youtube.com/watch?vnpcL7oRZQlI这个视频讲了什么东西, 什么 idea?好的,这个视频内容非常棒,信息量很足。下面为你详细总结视频讲了什么,以及核心的 Idea 是什么。 视频核心 Idea 这个视频讲的是一位名叫 Leandro…

Spring Boot 工程启动以后,我希望将数据库中已有的固定内容,打入到 Redis 缓存中,请问如何处理?

在 Spring Boot 工程中,将数据库中的固定内容预先加载到 Redis 缓存中可以通过以下步骤实现。这里假设你已经配置好了 Spring Data Redis 和数据库(如 MySQL)的连接。 1. 添加依赖 首先,确保你的 pom.xml(Maven&…

springboot企业级项目开发之项目测试——集成测试!

集成测试 集成测试是指项目代码在单元测试完成后进行的第二阶段测试。集成测试的重点是在集成组件或单元之间交互时暴露缺陷,以保证不同模块之间相互调用的正确性。在Spring Boot的项目集成测试中,将测试Controller和Dao的完整请求处理。应用程序在服务…

HTML 媒体(Media)

HTML 媒体(Media) 引言 HTML 媒体元素是构成现代网页的重要组成部分,它允许我们在网页中嵌入各种类型的媒体内容,如音频、视频、图像等。这些元素不仅丰富了网页的视觉效果,还提升了用户体验。本文将详细介绍 HTML 媒…

轻量化分布式AGI架构:基于区块链构建终端神经元节点的互联网智脑

一、架构概述 该架构通过将终端设备(如手机、IoT设备)转化为神经元节点,结合区块链技术构建去中心化智能网络,形成“互联网智脑”。其核心在于突破传统AGI算力瓶颈,实现数据安全共享与价值分配。 1.1 关键特征 分布…

【知识图谱构建系列6】:借了张显卡先跑着

文章目录 前情提要mistral模型运行代码前情提要 之前咱对LLM4KGC的代码稍作修改,目标是用modelscope来下载模型。 现在这个代码终于能跑了。 前面咱说,我们的显卡只有6G的显存。现在呢,我也成功借到了A100的显卡。这下,咱可以先跑跑这个项目默认带的mistral模型。 mist…

从零开始手写redis(16)实现渐进式 rehash map

手写 Redis 系列 java从零手写实现redis(一)如何实现固定大小的缓存? java从零手写实现redis(三)redis expire 过期原理 java从零手写实现redis(三)内存数据如何重启不丢失? jav…

List、Queue、Deque、Stack常用方法总结

Java 中几个常见的线性数据结构的 方法总结与对比,包括: List(ArrayList、LinkedList)Queue(LinkedList、PriorityQueue)Deque(ArrayDeque、LinkedList)Stack(传统 Stac…

github为InfiniSynapse Docker提PR过程留档@Windows10

为InfiniSynapse Docker提了一个PR:修改阿里源为清华源,并不再安装PPA。 by skywalk163 Pull Request #1 chaozwn/infini_docker 整体操作 提PR的前置动作 先fork要提PR的项目git clone到本地用VSCode修改代码 提交PR git add . git commit -m &…