news 2026/5/1 6:54:00

【MongoDB实战】6.3 索引优化实战:慢查询解决(补充)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【MongoDB实战】6.3 索引优化实战:慢查询解决(补充)

文章目录

  • 6.3 索引优化实战:慢查询解决
    • 6.3.1 识别慢查询:explain()方法深度解析
      • 核心概念
      • 实操步骤1:准备测试数据集
      • 实操步骤2:执行慢查询并分析执行计划
        • 执行结果解读(未加索引)
    • 6.3.2 优化案例:慢查询索引优化实战
      • 核心优化思路
      • 实操步骤1:创建复合索引
        • 索引列表输出
      • 实操步骤2:重新分析优化后的执行计划
        • 优化后结果解读
      • 优化效果对比
      • 进阶:索引覆盖查询(Covered Query)
    • 6.3.3 索引使用注意事项:避坑指南
      • 1. 避免过度索引
      • 2. 索引字段选择核心技巧
      • 3. 其他关键注意事项
    • 6.3.4 实战总结

6.3 索引优化实战:慢查询解决

慢查询是MongoDB性能瓶颈的核心来源之一,其本质是查询未有效利用索引,导致全表扫描(COLLSCAN)。

  • 本节通过实战代码+执行计划分析+索引优化的完整流程,讲解慢查询的识别、优化及索引使用的核心准则。

6.3.1 识别慢查询:explain()方法深度解析

核心概念

  • 慢查询定义:MongoDB默认将执行时间超过100ms的查询标记为慢查询(可通过setParameter修改阈值:db.adminCommand({setParameter:1, slowMS:200}))。

  • explain()作用:分析查询执行计划,定位慢查询瓶颈(是否走索引、扫描文档数、执行时间等)。

  • explain()三种模式:

模式说明适用场景
queryPlanner(默认)仅返回优化器选择的查询计划(不执行查询)快速查看索引是否被选中
executionStats执行查询并返回详细执行统计分析慢查询的真实性能指标
allPlansExecution返回所有候选计划的执行统计复杂查询的计划对比

实操步骤1:准备测试数据集

以用户数据为例,插入10万条测试数据模拟真实场景(Mongo Shell/ mongosh 执行):

// 1. 切换到测试数据库use test_db;// 2. 清空原有数据(测试用)db.users.drop();// 3. 生成10万条用户测试数据let users=[];for(let i=0;i<1000000;i++){users.push({username:`user_${i}`,age:Math.floor(Math.random()*50)+18,// 年龄18-68岁city:["北京","上海","广州","深圳","杭州"][Math.floor(Math.random()*5)],// 随机城市register_time:newDate(Date.now()-Math.floor(Math.random()*365*24*3600*1000)),// 近一年注册is_vip:Math.random()>0.7,// 30% VIP用户phone:`13${Math.floor(Math.random() * 900000000) + 100000000}`// 随机手机号});}// 4. 批量插入数据(MongoDB默认单次insertMany上限16MB,该数据量无压力)db.users.insertMany(users);print(`测试数据插入完成,总数:${db.users.countDocuments()} 条`);

实操步骤2:执行慢查询并分析执行计划

示例场景:查询「北京市的VIP用户,年龄大于30岁」,未加索引时分析执行计划:

// 简化版:只显示关键指标let query
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 2:12:04

Cordova与OpenHarmony换盆记录管理

欢迎大家加入开源鸿蒙跨平台开发者社区&#xff0c;一起共建开源鸿蒙跨平台生态。 换盆管理系统概述 换盆是植物生长过程中的重要环节&#xff0c;它为植物提供更多的生长空间和新鲜的土壤。在Cordova框架与OpenHarmony系统的结合下&#xff0c;我们需要实现一个完整的换盆记录…

作者头像 李华
网站建设 2026/4/30 18:36:11

SVG 多边形

SVG 多边形 SVG(可缩放矢量图形)是一种基于可缩放矢量图形的图形和图像的文件格式,它可以用于网页设计、动画制作以及图表展示等领域。在SVG中,多边形是一个非常基础且强大的图形元素。本文将详细介绍SVG多边形的定义、属性、创建方法以及在实际应用中的使用技巧。 一、S…

作者头像 李华
网站建设 2026/5/1 6:29:24

10_C 语言进阶之避坑指南:浮点数与精度损失—— 不可思议的 “量化误差”

C 语言进阶之避坑指南:浮点数与精度损失—— 不可思议的 “量化误差” 浮点数是 C 语言中处理小数、科学计数法数值的核心类型,看似简单的float和double,却暗藏大量容易被忽视的陷阱 —— 从精度丢失导致的计算错误,到浮点数比较的逻辑漏洞,再到嵌入式环境下的浮点运算支…

作者头像 李华
网站建设 2026/4/26 4:59:13

通信系统仿真:通信系统基础理论_(2).信号与系统

信号与系统 信号的分类 在通信系统中,信号是信息传递的基本载体。根据不同的特性,信号可以分为多种类型。了解信号的分类是进行通信系统仿真和分析的基础。 连续时间信号与离散时间信号 连续时间信号是指在时间上连续变化的信号,可以用数学函数 x(t)x(t)x(t) 表示,其中…

作者头像 李华
网站建设 2026/5/1 6:29:06

网易Java面试被问:偏向锁在什么场景下反而降低性能?如何关闭?

偏向锁性能问题详解 一、偏向锁的工作原理与性能隐患 1. 偏向锁设计初衷 java // 偏向锁的核心思想&#xff1a;大多数情况下锁不存在竞争 public class BiasedLockDesign {/*假设场景&#xff1a;单线程重复获取同一把锁无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁偏…

作者头像 李华
网站建设 2026/5/1 6:28:17

【ros2】ROS2中激光雷达/IMU/深度相机配置与RViz可视化全指南

文章目录 激光雷达/IMU/深度相机配置与RViz可视化全指南 一、文档概述 二、前置准备 2.1 环境与依赖 2.2 功能包与目录结构 三、传感器配置步骤(URDF/Xacro) 3.1 激光雷达(LiDAR)配置 3.1.1 编写Xacro配置文件 3.1.2 关键参数说明 3.2 惯性测量单元(IMU)配置 3.2.1 在Xac…

作者头像 李华