当前位置: 首页 > news >正文

【MongoDB实战】6.2 常用索引类型实战

文章目录

  • 第6章 性能优化:索引与查询效率提升
    • 6.2 常用索引类型实战
      • 6.2.0 前置准备:构建统一测试数据集
      • 6.2.1 单字段索引:基础高频索引类型
        • 核心概念
        • 实战实操
          • 步骤1:创建单字段索引
          • 步骤2:查看集合所有索引
          • 步骤3:验证单字段索引的查询效率
          • 步骤4:删除单字段索引
      • 6.2.2 复合索引:多字段组合查询优化
        • 核心概念
        • 实战实操
          • 步骤1:创建复合索引
          • 步骤2:验证复合索引的使用场景
          • 步骤3:复合索引的“前缀匹配”规则(关键避坑)
      • 6.2.3 唯一索引:解决重复数据问题
        • 核心概念
        • 实战实操
          • 步骤1:创建单字段唯一索引
          • 步骤2:创建复合唯一索引(多字段组合唯一)
          • 步骤3:处理已有重复数据的唯一索引创建
      • 6.2.4 数组索引:针对数组字段的索引优化
        • 核心概念
        • 实战实操
          • 步骤1:创建数组索引
          • 步骤2:验证数组索引的查询效率
          • 步骤3:数组索引的边界场景(避坑)
      • 6.2.5 索引管理与核心避坑总结
        • 1. 索引管理常用命令
        • 2. 核心避坑规则

第6章 性能优化:索引与查询效率提升

6.2 常用索引类型实战

MongoDB提供多种索引类型适配不同查询场景,核心是“按需创建索引”——既利用索引加速查询,又避免过度索引增加写入开销。

  • 本节通过可落地的实战代码,详解单字段、复合、唯一、数组索引的创建、使用与验证

6.2.0 前置准备:构建统一测试数据集

为保证所有索引测试的一致性,先创建包含“单字段、多字段、数组字段”的用户行为集合,插入10万条测试数据:

// 1. 切换数据库use performance_db;// 2. 清空历史集合(避免干扰)db.user_behavior.drop();// 3. 生成测试数据(包含数组字段tags/hobbies)let behaviorData=[];// 预设标签/爱好池(用于生成数组字段)consttagPool=["购物","游戏","学习","运动","美食","旅行","音乐","影视"];consthobbyPool=["跑步","游泳","看书","编程","做饭","摄影","钓鱼"];for(let i=0;i<100000;i++){// 随机生成数组字段:tags(2-4个标签)、hobbies(1-3个爱好)constrandomTags=tagPool.sort(()=>0.5-Math.random()).slice(0,Math.floor(Math.random()*3)+2);constrandomHobbies=hobbyPool.sort(()=>0.5-Math.random()).slice(0,Math.floor(Math.random()*3)+1);behaviorData.push({user_id:`U${String(i).padStart(6, '0')}`,// 用户ID(U000000~U099999)age:Math.floor(Math.random()*40)+20,// 年龄20-60岁city:["北京","上海","广州","深圳","杭州","成都"][Math.floor(Math.random()*6)],// 城市register_ts:newDate(Date.now()-Math.floor(Math.random()*365*24*3600*1000)),// 注册时间(近1年)tags:randomTags,// 兴趣标签(数组)hobbies:randomHobbies,// 爱好(数组)login_count:Math.floor(Math.random()*1000)+10// 登录次数(10-1009次)});}// 批量插入数据(效率优于单条插入)db.user_behavior.insertMany(behaviorData);print(`测试数据集创建完成,文档总数:${db.user_behavior.countDocuments()}`);

6.2.1 单字段索引:基础高频索引类型

核心概念

单字段索引是针对单个字段创建的索引(升序/降序),适用于“仅基于单个字段过滤/排序”的高频查询场景(如按年龄、城市、用户ID查询),是最基础、使用最广泛的索引类型

实战实操
步骤1:创建单字段索引
// 为age字段创建升序索引(1=升序,-1=降序,效果等价,仅影响排序方向)db.user_behavior.createIndex({age:1});// 为city字段创建降序索引(自定义索引名称,便于管理)db.user_behavior.createIndex({city:-1},{name:"idx_city_desc"});
步骤2:查看集合所有索引
// 查看索引列表(包含默认的_id_索引)constindexes=db.user_behavior.getIndexes();print("当前集合索引列表:");indexes.forEach((idx,i)=>{print(`${i+1}. 索引名称:${idx.name} | 索引字段:${JSON.stringify(idx.key)} | 是否唯一:${idx.unique || false}`);})
http://www.zskr.cn/news/117846.html

相关文章:

  • 【HarmonyOS NEXT】ohpm 安装依赖失败(@finclip 包找不到)问题复盘与解决方案
  • Git
  • Xiaomi MiMo-V2-Flash 开源:高效推理、代码与 Agent 基座模型
  • 【基于模型的强化学习】#1 引论:Dyna架构
  • CTF 比赛值得参加吗?计算机专业参赛必要性分析,附门槛要求与获奖好处!
  • Xhorse XDMPR8GL Adapter: Program MQB-RH850/V850 ECUs with Xhorse Multi Prog
  • 超适合CSDN站和B站的英语环境生成器。颠覆传统:忘掉“学”英语,开始“接触”英语!
  • React Native中实现鸿蒙跨平台开发使用状态管理库如`Redux`或`MobX`来管理应用状态,尤其是在处理多个组件共享状态时,使用`AsyncStorage`来存储用户数据和配置
  • 【毕业设计】基于 SpringBoot+Vue 的校园论坛微信小程序的设计与实现基于springboot+微信小程序的校园活动管理系统设计与实现(源码+文档+远程调试,全bao定制等)
  • Cordova与OpenHarmony目标进度可视化
  • 【毕业设计】基于springboot+微信小程序的应急救援小能手软件系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • 树莓派运行 DeepSeek 大模型实战:轻量化模型选型与内存占用控制精要
  • Python 爬虫实战:详解 requests 库发送 GET/POST 请求
  • 列表虚拟化的实现-百万数据轻松展示
  • Cordova与OpenHarmony训练计划制定
  • Day32:SPI 配置与使用
  • 计算机小程序毕设实战-基于springboot+微信小程序的DIY电脑朱庄配件方案推荐与交流平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Python 爬虫实战:将爬取数据存入 CSV 表格
  • 测试环境如何生成自签名证书用于 HTTPS
  • day38打卡
  • 大岩资本黄铂:A股量化的未来是细节致胜
  • 计算机小程序毕设实战-基于springboot+微信小程序的餐厅预约系统设计与实现基于SpringBoot的在线点餐系统微信小程序【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Python 爬虫实战:urllib 库的核心用法与实战案例
  • DPJ-137 基于单片机的公交车自动报站系统设计(源代码+proteus仿真)
  • 【毕业设计】基于WEB的景点门票销售系统基于JAVA白云山景点门票销售管理系统(源码+文档+远程调试,全bao定制等)
  • 计算机小程序毕设实战-基于springboot+微信小程序的在线复习小程序基于SpringBoot+微信小程序考试刷题系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 电动汽车负荷随机性下的蓄电池容量优化配置:MATLAB实现与探索
  • 【毕业设计】基于Java的校内外卖订餐点餐配送系统基于JAVA的学院校内订餐系统的实现(源码+文档+远程调试,全bao定制等)
  • 硬盘突然坏掉,我花了半个月才把数据救回来…(附数据恢复工具)
  • 【毕业设计】基于Javaweb的租车管理系统的设计与实现(源码+文档+远程调试,全bao定制等)