第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的聚合框架及其管道操作,通过一系列实用示例,帮助大家掌握如何利用聚合功能来处理复杂的数据分析任务。

相关推荐
NCIN EXPE几秒前
redis 使用
数据库·redis·缓存
MongoDB 数据平台1 分钟前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
lUie INGA6 分钟前
在2023idea中如何创建SpringBoot
java·spring boot·后端
极客on之路7 分钟前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家14 分钟前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE15 分钟前
开启mysql的binlog日志
数据库·mysql
yejqvow1224 分钟前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
oLLI PILO29 分钟前
nacos2.3.0 接入pgsql或其他数据库
数据库
geBR OTTE31 分钟前
SpringBoot中整合ONLYOFFICE在线编辑
java·spring boot·后端
m0_7436239233 分钟前
HTML怎么创建多语言切换器_HTML语言选择下拉结构【指南】
jvm·数据库·python