MongoDB-单键索引与复合索引

server/2024/12/14 10:26:37/

主页.png

在 MongoDB 中,索引是提高查询性能的一个重要手段。通过为集合中的字段创建索引,可以显著加快对数据的检索速度。MongoDB 支持多种类型的索引,其中 单键索引 和 复合索引 是最常用的两种类型。了解这两种索引的工作原理、使用场景以及区别,能够帮助开发者在设计数据库时做出更明智的决策,从而提高应用程序的性能。

一、单键索引(Single Field Index)

1 单键索引的概念

单键索引 是针对集合中某个字段(即单个键)创建的索引。当你为某个字段创建单键索引时,MongoDB 会为该字段的每个值创建一个索引条目,并将这些条目按照排序的方式存储在 B 树结构中。

单键索引是 MongoDB 默认的索引类型,且每个集合会自动为 _id 字段创建单键索引。因此,查询 _id 字段时,不需要手动创建索引。

2 单键索引的创建

创建单键索引的语法非常简单,使用 createIndex() 方法即可。以下是为 name 字段创建单键索引的示例:

db.collection.createIndex({ name: 1 });  // 1 表示升序,-1 表示降序
{ name: 1 } 表示为 name 字段创建升序索引。
如果你想创建降序索引,可以使用 { name: -1 }。
3 单键索引的使用场景

单键索引适用于以下几种常见场景:

  • 单字段查询:当你经常根据某个字段(如 username, email, product_id 等)进行查询时,创建单键索引能够提高查询效率。
  • 简单的排序:如果你经常按某个字段排序结果,创建该字段的单键索引会加速排序操作。
  • 唯一性约束:_id 字段本身就是一个单键索引,并且 MongoDB 会确保该索引的唯一性。你也可以为其他字段创建唯一的单键索引,保证字段值的唯一性。
    例如,为 email 字段创建唯一索引,保证每个邮箱地址只出现一次:
db.users.createIndex({ email: 1 }, { unique: true });
4 单键索引的优缺点

优点

  • 查询效率高:对单个字段的查询会显著加快,尤其是在字段值的选择性较高时(即字段的值有较大差异)。
  • 简单易用:创建和管理单键索引非常简单,适用于大多数场景。

缺点

  • 单一字段的限制:只能针对一个字段进行查询优化,如果查询条件包含多个字段,单键索引的效果会有限。

二、复合索引(Compound Index)

1 复合索引的概念

复合索引 是在多个字段上创建的索引。MongoDB 会根据这些字段的值创建一个复合索引条目,其中包含多个字段的组合值。复合索引非常适用于查询中包含多个字段作为条件的情况,可以显著提升复合查询的性能。

复合索引不仅支持多个字段的查询优化,还支持根据复合索引的字段顺序进行排序、范围查询等操作。通过复合索引,MongoDB 可以根据索引的顺序高效地找到匹配的文档。

2 复合索引的创建

复合索引的创建方法与单键索引类似,只不过需要在索引文档中列出多个字段。以下是为 first_name 和 last_name 字段创建复合索引的示例:

db.collection.createIndex({ first_name: 1, last_name: 1 });
{ first_name: 1, last_name: 1 } 表示为 first_name 和 last_name 字段创建一个升序的复合索引。
如果需要创建降序索引,可以使用 { first_name: -1, last_name: -1 }。
3 复合索引的使用场景

复合索引适用于以下几种情况:

  • 多字段查询:当查询中涉及多个字段时,使用复合索引可以加速查询。例如,查询条件同时包含 first_name 和 last_name 字段时,复合索引会比单独使用两个单键索引更高效。
  • 排序优化:复合索引可以加速排序操作,尤其是当多个字段参与排序时。例如,如果查询结果需要按照 first_name 排序,再按照 last_name 排序,复合索引可以显著提高性能。
  • 范围查询:复合索引不仅支持精确匹配,还可以用于范围查询(例如查询某个字段的范围,另一个字段的精确匹配)。

例如,查询 first_name 和 last_name 的组合条件,可以通过复合索引来加速:

db.collection.find({ first_name: "John", last_name: "Doe" });
4 复合索引的注意事项
  • 字段顺序很重要:复合索引的性能取决于字段的顺序。MongoDB 会按照索引定义的顺序来查找和排序数据。因此,在创建复合索引时,需要根据查询的频繁使用模式来选择字段的顺序。

例如,如果你经常根据 first_name 和 last_name 进行查询,并且会先按 first_name 排序,再按 last_name 排序,那么应该优先将 first_name 放在索引的前面。

db.collection.createIndex({ first_name: 1, last_name: 1 });
  • 覆盖索引:复合索引可以帮助实现“覆盖索引”优化,即查询可以完全通过索引来完成,无需回表查询。为了实现覆盖索引,查询的字段必须完全包含在复合索引中。

例如,如果复合索引包含 first_name 和 last_name 字段,并且查询只涉及这两个字段,则 MongoDB 可以直接从索引中返回结果,而无需访问实际的文档。

5 复合索引的优缺点

优点

  • 多个字段优化:复合索引可以同时优化多个字段的查询,尤其是在查询涉及多个条件时。
  • 排序和范围查询优化:复合索引能够同时加速排序操作和范围查询,特别适用于复杂的查询模式。
    缺点
  • 空间开销较大:复合索引的大小通常比单键索引大,特别是当索引包含多个字段时。
  • 创建和维护成本较高:如果复合索引涉及的字段较多,每次文档插入、删除或更新时,MongoDB 都需要更新多个索引,可能导致性能下降。

三、单键索引与复合索引的比较

特性单键索引复合索引
适用场景单个字段的查询多个字段的查询、排序、范围查询等
查询性能适用于简单的字段查询适用于多字段查询、排序和范围查询
索引顺序只考虑单个字段索引顺序非常重要,字段的顺序会影响查询性能
覆盖索引只能覆盖单个字段的查询可以实现覆盖索引优化,返回查询字段的结果
索引大小相对较小相对较大,尤其是涉及多个字段时
创建和维护成本

总结

MongoDB 中的 单键索引 和 复合索引 是查询优化的两种常见方式。单键索引适用于单个字段的查询,简单易用且性能较高;而复合索引则适用于需要同时考虑多个字段的查询,可以显著提高复杂查询的效率。在使用索引时,应该根据具体的查询模式和数据特点来选择合适的索引类型,以便在保证性能的同时减少资源消耗。

二维码.png


http://www.ppmy.cn/server/150066.html

相关文章

本地体验新版springcloud-搭建工程学习笔记

为了快速体验下新版本springcloud.对照b站图灵视频简单记录下。起码入门不要钱,值得推荐。 基础知识: 会用springboot写demo。 会用mybatis操作MYSQL。 会用git拉取代码。 这都是基本操作。 环境准备: jdk17 demo是21.我实际测试17也可…

Nginx之配置防盗链(Configuring Anti-hotlinking in Nginx)

运维小白入门——Nginx配置防盗 什么是防盗链: 防盗链技术主要用于防止未经授权的第三方或域名访问网站的静态资源。例如,一个网站可能拥有独特的图片素材,为了防止其他网站通过直接链接图片URL的方式访问这些图片,网站管理员会采…

MedLSAM: 用于3D CT图像的局部化和分割模型|文献速递-生成式模型与transformer在医学影像中的应用

Title 题目 MedLSAM: Localize and segment anything model for 3D CT images MedLSAM: 用于3D CT图像的局部化和分割模型 01 文献速递介绍 最近,计算机视觉领域对开发大规模的基础模型的兴趣不断增加,这些模型能够同时处理多个视觉任务&#xff0c…

常见的网络命令

目录 1. ping2. netstat3. pidof 1. ping ping 命令可以用于检查两台主机是否连通(是否可以进行通信) ping -cn ip/域名 -cn: 指定 ping 的次数 n2. netstat netstat:一个查看网络状态的工具,常用于监听 常用选项 -n 拒绝显示别名…

pcl::PointCloud<pcl::PointXYZ>和pcl::PointCloud<pcl::PointXYZ>::Ptr 转换及新建点云显示

点云智能指针格式和非指针格式的转换 pcl::PointCloud<PointT>::Ptr cloud_ptr(new pcl::PointCloud<PointT>); pcl::PointCloud<PointT> cloud; cloud *cloud_ptr; cloud_ptr boost::make_shared<pcl::PointCloud<PointT>>(cloud);全部代码&…

电商数据API接口:安全与性能的双重挑战

随着电子商务的蓬勃发展&#xff0c;电商平台与外部服务、内部系统之间的数据交换和通信变得日益频繁。API&#xff08;应用程序编程接口&#xff09;接口作为这一过程中的关键枢纽&#xff0c;其安全性和性能表现对于电商平台的稳定运行和用户体验至关重要。然而&#xff0c;电…

期末复习-计算机网络

目录 第四章&#xff1a;网络层 1. 虚电路服务和数据报服务的对比 2. 分类的 IP 地址 3. IP 地址与硬件地址&#xff0c;地址解析协议 ARP 4. IP 数据报的格式 5. IP 层转发分组的流程 6. 划分子网&#xff08;子网掩码、划分子网、使用子网时分组的转发&#xff09; …

阿里云数据库MongoDB版助力极致游戏高效开发

客户简介 成立于2010年的厦门极致互动网络技术股份有限公司&#xff08;以下简称“公司”或“极致游戏”&#xff09;&#xff0c;是一家集网络游戏产品研发与运营为一体的重点软件企业&#xff0c;公司专注于面向全球用户的网络游戏研发与运营。在整个产业链中&#xff0c;公…