

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用索引的最佳实践
<a name="best-practices-indexes"></a>

## 建立索引
<a name="best-practices-building-indexes"></a>

将数据导入 Amazon DocumentDB 时，最好在导入大型数据集之前先创建索引。您可以使用[亚马逊 DocumentDB 索引工具](https://github.com/awslabs/amazon-documentdb-tools/tree/master/index-tool)从正在运行的 MongoDB 实例或 mongodump 目录中提取索引，然后在 Amazon DocumentDB 集群中创建这些索引。有关迁移的更多指导，请参阅[迁移到 Amazon DocumentDB](docdb-migration.md)。

## 索引选择性
<a name="best-practices-index-selectivity"></a>

我们建议您将索引创建限制为其中的重复值数量低于集合中总文档数的 1% 的字段。例如，如果您的集合包含 100,000 个文档，则仅在相同值出现次数不超过 1,000 次的字段上创建索引。

选择具有大量唯一值（即高基数）的索引可确保筛选操作返回少量文档，从而在索引扫描期间获得良好的性能。高基数索引的一个例子是一个唯一索引，它保证相等谓词最多返回单个文档。低基数的示例包括布尔字段上的索引和一周中某天的索引。由于低基数索引的性能较差，数据库的查询优化器不太可能选择低基数索引。同时，低基数索引继续消耗资源，例如磁盘空间和。 I/Os作为经验法则，应将索引定位于典型值频率为总集合大小的 1% 或更小的字段。

此外，建议仅在通常用作筛选条件的字段上创建索引，并定期查找未使用的索引。有关更多信息，请参阅 [如何分析索引使用情况并识别未使用的索引？](user_diagnostics.md#user-diag-index-usage)。

## 索引对数据写入的影响
<a name="best-practices-impact-writing"></a>

虽然索引可以通过避免扫描集合中的每个文档来提高查询性能，但这种提高是有代价的。对于集合的每个索引，每次插入、更新或删除文档时，数据库都必须更新集合并将字段写入集合的每个索引。例如，如果某个集合有九个索引，则数据库必须执行十次写入操作，才能将操作通知给客户端。因此，每增加一个索引都会导致额外的写入延迟 I/Os，并增加总利用的存储空间。

所以应该适当调整集群实例的大小，以确保将所有工作集容纳在内存中。这就避免了从存储卷中持续读取索引页的需要，因为这会对性能产生负面影响并产生更高 I/O 的成本。有关更多信息，请参阅[调整实例规模](https://docs.aws.amazon.com/documentdb/latest/devguide/best_practices.html#best_practices-instance_sizing)。

为了获得最佳性能，请尽量减少集合中的索引数量，仅添加必要的索引来提高常用查询的性能。虽然工作负载会变化，但有一个很好的指导原则，就是将每个集合的索引数量保持在五个以内。

## 识别缺失的索引
<a name="best-practices-missing-indexes"></a>

我们建议您定期识别缺失的索引，这是一种很好的做法。有关更多信息，请参阅 [如何识别缺失的索引？](user_diagnostics.md#user_diagnostics-identify_missing_indexes)。

## 识别未使用的索引
<a name="best-practices-unused-indexes"></a>

我们建议您定期识别并删除未使用的索引，这是一种很好的做法。有关更多信息，请参阅 [如何分析索引使用情况并识别未使用的索引？](user_diagnostics.md#user-diag-index-usage)。