公告推出MongoDB 8.0,有史以来最快的MongoDB! 阅读更多 >>推出MongoDB 8.0,有史以来最快的MongoDB! >>

数据库中的索引是什么?

一个好的索引策略对于确保您的MongoDB数据库以最有效的方式返回结果至关重要。要构建一个稳固的策略,您需要考虑数据库模式、使用模式和数据库服务器配置等因素。

在本篇文章中,您将学习数据库索引是什么,如何在MongoDB中使用它们,以及如何利用MongoDB Atlas性能顾问来优化您的查询。

什么是索引?

数据库索引是一种特殊的数据结构,它提供了更快的访问数据的能力,并有助于创建高性能的应用程序。索引通常由两列组成:搜索键和数据指针。键存储您想要搜索的值,指针指向数据所在的数据块。假设您有一个名为'exam'的集合(表)的'score'字段(列)上的索引。当您想访问分数小于40的分数时,索引将扫描数据块而不是单个文档(行)。

Simple database index

数据库索引的示例

为什么索引很重要

没有索引,数据库引擎需要遍历每个记录以查看是否存在匹配项。

数据库索引是组织信息的一种方式,以便数据库引擎可以快速找到相关结果。

您可以在分组、排序和数据检索上节省大量时间。数据库允许您添加多个索引,从而进一步提高查询效率。

您如何使用数据库索引?

将数据库索引想象成书索引(通常在书末尾)。每个关键词都按字母顺序列出,并列出使用该词的页码,使用户能够快速查找该词。数据库索引的工作方式与此类似。假设您在数据库中存储了1000个关键词名称。如果它们按名称(a->z或z->a)排序,则根据排序查找最后一个关键词、中间关键词或特定关键词会更简单。


How index works

如何通过索引加速查询结果


在决定要索引哪些字段或集合时,请考虑在查询中使用更频繁的数据——例如,姓名、ID或两者组合,根据需要。类似地,索引您最可能用于排序、分组或排序数据的字段。

MongoDB中的索引

与传统数据库一样,MongoDB使用索引来优化查询。MongoDB中的任何集合都可以有一个或多个索引,这些索引可以针对一个或多个字段创建。您不能重复MongoDB索引——这很好,因为索引确实有一定的成本,这就是为什么您需要制定一个好的策略来创建索引的原因。

假设您有一个销售集合,并且您想要获取季度的文档列表。如果您没有索引,数据库引擎需要遍历数据库中的每个记录,验证日期是否在指定范围内,如果是在,则将其添加到结果中。

查询集合中的所有文档很耗时,会占用许多资源。

An animated image showing the difference between querying data with and without an index.

如果您在销售日期上创建了数据库索引,数据库引擎将快速找到第一个匹配的文档,并遍历列表直到达到所需的结束日期。这比逐个记录查找要高效得多。

跟随我们的大学课程了解更多关于MongoDB索引的信息。

索引类型

MongoDB中有很多种索引类型可用。最常见的是单字段和复合索引类型。如果您处理数组、聚合、地理空间数据或全文搜索,则可以使用更高级的索引类型。您可以在文档中找到有关这些索引类型的更多信息。

单字段

MongoDB中的每个集合都自动在_id字段上创建一个索引。这个索引可以用来高效地从数据库中检索文档。

然而,您大部分时间需要查询其他特定字段上的数据。这时,单字段索引就派上用场了。

比如说,您想定期获取前三个销售额。

An animated image showing the difference between querying data with and without an index.


这里一个不错的索引是金额字段。

db.collection.createIndex( { amount: 1 });

前三个销售额总是索引中的前三个元素,这使得它比每次查询整个集合要快得多。

复合索引

您还可以对多个字段进行查询。比如说,您想获取特定日期的前三个销售额。那么,添加一个包括日期和金额的复合索引将是最有效率的。

db.collection.createIndex( { date: 1, amount: 1 });

这将创建一个按日期排序,然后按金额排序的索引。

我们也可以在嵌入数组上使用索引。

索引创建的ESR规则

为查询创建正确的索引并不总是显而易见的。然而,有一个通用的规则可以帮助您,称为ESR(等价、排序、范围)规则。

这个规则是一个思维框架,描述了如何构建您的复合索引。从使用精确匹配的字段开始,添加用于排序的字段,最后添加用于非精确匹配的字段(即$lt或$ne运算符)。

MongoDB Atlas索引管理

MongoDB Atlas使用与MongoDB相同的索引原则,但提供了快速创建索引的工具。

创建索引

您可以使用Mongo中的createIndex方法创建索引。

db.collection.createIndex( <key and index type specification>, <options> )

Atlas UI提供了一个图形用户界面,让您可以创建索引。您还可以使用Atlas Search添加全文搜索索引。

A screenshot of the Create Index modal in the Atlas UI

删除索引

您也可以像创建一样容易地使用Atlas UI或Mongosh删除索引。

db.collection.dropIndex(<index name>)

在Atlas中,您可以从浏览集合页面的索引标签中删除索引。


Dropping index via Atlas

使用MongoDB Atlas UI删除数据库索引

索引优化

Atlas的另一个出色功能是它的性能顾问。该工具分析您的频繁查询,并建议您可以创建以提高性能的新索引。

A screenshot of the Create Index modal in the Atlas UI


它还可以推荐冗余或未使用的索引,这些索引在其他情况下可能无端占用磁盘空间并影响写入性能。

您还可以使用Mongo Shell中的explain方法单独分析您的查询计划

摘要

当数据库存在性能问题时,一个简单的解决方案通常是添加适当的索引。这些索引将为您的集合创建一个排序映射,以便更容易检索文档。要找出需要创建哪些索引,您应使用ESR规则或MongoDB Atlas中的性能顾问。您甚至可以免费试用。一旦您开始向集合添加适当的索引,您应该能够看到查询性能的显著提升。

常见问题解答

什么是数据库中的索引?

数据库索引是一种特殊的数据结构,它提供了对特定数据的快速访问,而无需访问存储在特定表中的所有数据。没有索引,数据库引擎需要在事务环境中遍历每条记录,以查看是否存在匹配项。

什么是MongoDB索引?

数据库索引是集合到文档的映射,使其更容易检索文档。MongoDB可以通过列出映射到集合的排序文档来轻松找到匹配您的查询的文档。

MongoDB中有索引吗?

是的,MongoDB支持多种数据库索引类型。最常见的是单字段和复合索引。更高级的索引类型包括多键、地理空间、文本和散列索引。

MongoDB可以处理数百万条记录吗?

是的,MongoDB被认为支持巨大的数据集。高效查询这些数据的关键是良好的索引策略。