《MongoDB入门教程》第29篇 复合索引
创始人
2025-05-29 07:00:48

本文将会介绍 MongoDB 复合索引的概念,以及如何创建复合索引。

复合索引

复合索引(compound index)是指基于多个字段的索引,通常可以用于优化匹配多个字段的查询。

复合索引同样可以使用 createIndex() 方法创建,语法如下:

db.collection.createIndex({field1: type,field2: type,field3: type,...
});

其中,field1、field2、field3 都是字段;type 代表了类型,1 表示索引中的数据按照升序排列,-1 表示按照降序排列。

ℹ️MongoDB 复合索引最多包含 32 个字段。

复合索引中的字段顺序至关重要。如果一个复合索引包含字段 field1、field2,索引首先按照 field1 进行排序,如果 field1 相同,再按照 field2 排序。

复合索引遵循最左匹配原则。例如,一个复合索引包含字段 field1、field2,可以支持以下查询优化:

  • 基于字段 field1 的匹配
  • 基于字段 field1 以及 field2 的匹配

但是,它不支持基于字段 field2 的查询优化。

优化示例

首先,我们为集合 movies 创建一个基于 Title 以及 Release Date 的复合索引:

db.movies.createIndex({ Title: 1, 'Release Date': 1 })'Title_1_Release Date_1'

然后查找名称包含 batman,并且在 2005 年 1 月 15 日发行的电影:

db.movies.find({Title: /batman/i, "Release Date": 'Jun 15 2005'}).explain('executionStats');...inputStage: {stage: 'IXSCAN',filter: {Title: BSONRegExp("batman", "i")},nReturned: 1,executionTimeMillisEstimate: 5,works: 3180,advanced: 1,needTime: 3178,needYield: 0,saveState: 3,restoreState: 3,isEOF: 1,keyPattern: {Title: 1,'Release Date': 1},indexName: 'Title_1_Release Date_1',
...

查询使用了索引 Title_1_Release Date_1,而不是扫描整个集合。

然后查找名称包含 batman 的电影:

db.movies.find({Title: /batman/i}).explain('executionStats');...inputStage: {stage: 'IXSCAN',filter: {Title: BSONRegExp("batman", "i")},nReturned: 6,executionTimeMillisEstimate: 0,works: 3192,advanced: 6,needTime: 3185,needYield: 0,saveState: 3,restoreState: 3,isEOF: 1,keyPattern: {Title: 1,'Release Date': 1},indexName: 'Title_1_Release Date_1',
...

以上查询只匹配了 Title,优化器仍然能够使用复合索引进行优化。

然后查找在 2005 年 1 月 15 日发行的电影:

db.movies.find({"Release Date": 'Jun 15 2005'}).explain('executionStats');...executionStages: {stage: 'COLLSCAN',filter: {'Release Date': {'$eq': 'Jun 15 2005'}},nReturned: 1,
...

这种情况下,查询优化器无法使用复合索引,而是通过扫描整个集合(COLLSCAN)查找数据。

相关内容

热门资讯

计算机网络(第九弹) --- ...   传输控制协议 TCP 在整个计算机网络中占有很高的地位, 它会控制着网络上数据的传输过程, 当然...
Java二叉树的前中后序遍历 Java二叉树的前中后序遍历1.前序遍历1.1前序遍历概念1.2前序遍历习题2.中序遍历2.1中序遍...
电动汽车十大名牌排名及价格,纯... 今天给各位分享电动汽车十大名牌排名及价格,纯电动汽车排名及价格...的知识,其中也会对电动汽车十大名...
长安奔奔mini保养(长安奔奔... 本篇文章极速百科给大家谈谈长安奔奔mini保养,以及长安奔奔mini保养手册对应的知识点,希望对各位...
Python-06:异常、模块... 文章目录一、异常1.1 异常的概念1.2 捕获异常的语法1.3 代码演示1.4 异常的传递性二、模块...
满州是哪里(日本口中的满洲是哪... 今天给各位分享满州是哪里的知识,其中也会对日本口中的满洲是哪里进行解释,如果能碰巧解决你现在面临的问...
义乌交通违章查询,浙江义乌交通... 今天给各位分享义乌交通违章查询,浙江义乌交通违章查询的知识,其中也会对义乌违章查询入口进行解释,如果...
WEB安全 DIV CSS基础 1.DIV和CSS样式             层叠样式表(英文全称:Cascadin...
灵感来自游艇?聊天津一汽骏派C... 今天给各位分享灵感来自游艇?聊天津一汽骏派CX65设计的知识,其中也会对一汽骏派suv进行解释,如果...
汽车维修哪个学校比较好?(学汽... 今天给各位分享汽车维修哪个学校比较好?的知识,其中也会对学汽车维修哪个学校好,快来看看!进行解释,如...
科学技术的两面性是什么(科学技... 本篇文章极速百科给大家谈谈科学技术的两面性是什么,以及科学技术的两面性发言稿50字对应的知识点,希望...
京沪高速实时路况(京沪高速实时... 本篇文章极速百科给大家谈谈京沪高速实时路况,以及京沪高速实时路况今天封闭没有对应的知识点,希望对各位...
[刷题 java版] | 字节... 1.万万没想到之聪明的编辑我叫王大锤,是一家出版社的编辑。我负责校对投稿来的英文稿件&...
#科研筑基# 吴恩达深度学习 ... 引例这门课的名字叫深度学习,为什么我们要先介绍神经网络呢?那是因为&#x...
vue3一天内快速学习 文章目录简介vue3 学习安装项目结构基础知识模版语法{{}}v-htmlv-bind渲染展示v-i...
特斯拉专题研究报告:特斯拉第三... 今天给各位分享特斯拉专题研究报告:特斯拉第三篇章展望的知识,其中也会对特斯拉研究成果进行解释,如果能...
高速免费提前几个小时(高速免费... 今天给各位分享高速免费提前几个小时的知识,其中也会对高速免费提前几个小时上高速进行解释,如果能碰巧解...
卡罗拉和朗逸怎么选哪个更值得入... 今天给各位分享卡罗拉和朗逸怎么选哪个更值得入手的知识,其中也会对卡罗拉和朗逸买哪个好更好进行解释,如...
MAC QT OpenGL 图... 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES...
海藻粉是什么东西(海藻粉是什么... 今天给各位分享海藻粉是什么东西的知识,其中也会对海藻粉是什么东西 宝宝能吃吗进行解释,如果能碰巧解决...
关于MGRE的OSPF建邻 我们以实验的方式直观的看一下OSPF在MGRE中的建邻。 首先介绍一下接口网络类型。 MGRE嘴上形...
MySQL和MariaDB,它... 目录 一、MySQL简介 二、MariaDB简介 三、什么是MariaDB? 四、为什么推出Mari...
羡慕的意思是什么(羡慕的意思是... 本篇文章极速百科给大家谈谈羡慕的意思是什么,以及羡慕的意思是什么最佳答案对应的知识点,希望对各位有所...
发蜡有什么作用(发蜡有什么作用... 今天给各位分享发蜡有什么作用的知识,其中也会对发蜡有什么作用和用途进行解释,如果能碰巧解决你现在面临...
欧洲杯几月开始几月结束(欧洲杯... 今天给各位分享欧洲杯几月开始几月结束的知识,其中也会对欧洲杯啥时候开始啥时候结束进行解释,如果能碰巧...
横滨轮胎型号及价格表(横滨轮胎... 今天给各位分享横滨轮胎型号及价格表的知识,其中也会对横滨轮胎型号性能介绍进行解释,如果能碰巧解决你现...
基于深度学习的跌倒检测系统(U... 摘要:跌倒监测系统用于智能化监测是否有行人跌倒,通过YOLOv5的深度学...
基于STM32 + FPGA ... 针对在软体机器人控制时,多电机协同控制过程中难度大、通用性差、协同性差等缺点ÿ...
【Docker】什么是Dock... 文章目录Docker出现的背景解决问题docker理念容器与虚拟机比较容器发展简史传统虚拟机技术容器...
五十万以内买SUV,这几款的第... 本篇文章极速百科给大家谈谈五十万以内买SUV,这几款的第三排都能坐成年人,以及五十万左右七座suv对...