第8章 MongoDB性能提升--索引详解与实战案例

在上一篇文章【练中学,学中练:MongoDB综合查询实战】中,我们通过一系列实际操作,深入探讨了MongoDB中的查询技巧。从基本的条件筛选到复杂的逻辑组合查询,每个任务都旨在帮助你更好地理解和掌握MongoDB的查询功能。本文为了提高查询性能,MongoDB 支持索引。本文将深入探讨 MongoDB 中的索引概念、类型以及如何创建与使用索引,最终通过实例来展示其应用。

知识回顾

什么是索引?

索引是在数据库中对数据的结构化表示,可以加快查询速度。就像书籍的目录能快速定位相关内容一样,索引能提高数据库检索的效率。没有索引,数据库需要扫描整个集合,这在数据量大时会显著降低性能。

索引类型

MongoDB 支持多种类型的索引,主要包括:

  1. 单字段索引:对集合中的单个字段建立索引。
  2. 复合索引:对多个字段组合建立索引。
  3. 部分索引:只对满足特定条件的文档建立索引。
  4. 稀疏索引:仅在存在索引字段的文档上创建索引。
  5. 全文索引:支持对文本内容进行复杂的全文搜索。
  6. 地理空间索引:用于空间数据搜索,如经纬度坐标。

如何创建索引

创建单字段索引

使用以下命令在 student 集合的 stu_name 字段上创建单字段索引:

css 复制代码
db.student.createIndex({ stu_name: 1 })

创建复合索引

student 集合上创建复合索引(stu_nameemail 字段):

php 复制代码
db.student.createIndex({ stu_name: 1, email: 1 })

创建部分索引

status 字段值为 "active" 的用户创建部分索引:

css 复制代码
db.student.createIndex({ stu_name: 1 }, { partialFilterExpression: { status: "active" } })

查看索引

使用以下命令查看当前集合的所有索引:

scss 复制代码
db.student.getIndexes()

任务描述

假设我们有一个高校大学生档案管理系统学生数据有1000w ,学生数据数据存储在 student 集合中,字段包括stu_nostu_namemobileemailstatus。为了提高基于 usernameemail 的查询效率,我们将使用复合索引。

任务实施

步骤一:使用【动手吧!MongoDB 插入文档的性能优化:单个、多个、批量及分批次插入】中方法,分批次生成1000w不同学生数据

php 复制代码
var arr = [];
var batchSize = 5000;

for(var i=1 ; i<=10000000 ; i++){
    arr.push({
     stu_name:"张小峰"+i,
     stu_no:i,
     email:"student"+i+"@163.com",
     status: Math.random() > 0.5 ? "active" : "inactive", 
     mobile: "138"+Math.floor(Math.random() * 90000000 + 10000000)
});
    if (i % batchSize == 0) {
        try {
            db.student.insertMany(arr);
            print("已插入 " + i + " 个文档");
        } catch (e) {
            print("文档插入失败:" + e);
        }
        arr = []; // 清空数组,准备下一批
    }
}

// 插入剩余的文档
if (arr.length > 0) {
    try {
        db.student.insertMany(arr);
        print("已插入剩余的 " + arr.length + " 个文档");
    } catch (e) {
        print("文档插入失败:" + e);
    }
}

效果如下:

步骤二:创建复合索引

创建复合索引以提高基于 stu_nameemail 的查询性能:

php 复制代码
db.student.createIndex({ stu_name: 1, email: 1 });

步骤三:查询测试

执行一些查询操作以测试索引效果:

php 复制代码
// 查询活跃用户 张小峰126的信息
db.student.find({ stu_name: "张小峰126", status: "active" });

// 查询邮件为student126@163.com 的用户
db.student.find({ email: "student126@163.com" });

步骤四:分析查询性能

通过 explain 方法分析查询性能:

lua 复制代码
db.student.find({ stu_name: "张小峰126", status: "active" }).explain("executionStats");

在执行后,你将看到查询的性能统计数据,包括是否使用了索引、查询的执行时间等信息。

小结:索引是提升 MongoDB 查询性能的关键工具。通过创建不同类型的索引,可以满足不同场景下的查询需求。然而,索引也会带来写操作的额外负担,因此在创建索引时要进行合理的权衡。通过实践案例,你应该能够理解如何在 MongoDB 中创建和使用索引,从而优化你的数据库应用程序的性能。

实验实训

学习其他索引使用

  1. 单字段索引:对集合中的单个字段建立索引。
  2. 部分索引:只对满足特定条件的文档建立索引。
  3. 稀疏索引:仅在存在索引字段的文档上创建索引。
  4. 全文索引:支持对文本内容进行复杂的全文搜索。
  5. 地理空间索引:用于空间数据搜索,如经纬度坐标。

在本文中,我们深入探讨了MongoDB中的索引概念,了解了不同类型的索引及其创建方法,并通过实际案例展示了如何利用复合索引提升查询效率。通过创建索引并分析其对查询性能的影响,我们发现合理使用索引可以显著改善数据库操作的速度。接下来的文章里,我们将进一步学习MongoDB的聚合框架及其管道操作,通过一系列实用示例,帮助大家掌握如何利用聚合功能来处理复杂的数据分析任务。

相关推荐
TDengine (老段)1 小时前
TDengine 常见问题 TOP3
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
步行cgn1 小时前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring
RISCV_Explorer3 小时前
RISC-V启动与运行时规范机制解析——BRS约定、HSM多核启动与设备树要求
后端·risc-v
星栈独行3 小时前
ADK-Rust 是什么?Rust 生态新一代 AI Agent 开发套件
人工智能·后端·rust
螺蛳粉 螺蛳粉4 小时前
MySQL 分布式集群系列 · 第五篇——全方位对比:NDB、MGR、主从复制、分库分表怎么选?
数据库·分布式·mysql
JavaGuide4 小时前
对标 MinIO!全新一代分布式文件系统正式发布
前端·后端
用户8356290780514 小时前
使用 Python 将 DOCX 转换为 Markdown
后端·python
IT_陈寒4 小时前
Vue computed属性这个坑,我居然踩了三次才爬出来
前端·人工智能·后端
孙启超5 小时前
【AI开发之Rust】第 7 课:错误处理 —— panic、Result 与 `?`
人工智能·分布式·后端·爬虫·spring cloud·架构·rust
DBA小马哥5 小时前
MongoDB 迁移切流回滚怎么做?停机窗口、增量同步、数据校验全套检查清单
mongodb·迁移学习