

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

# 低使用率和冗余索引
<a name="anti-pattern-low-used-redundant-indexes"></a>

## 概述
<a name="low-indexes-overview"></a>

索引可以提高工作负载的整体查询性能，但会带来成本。每个索引都消耗存储空间和 I/O 资源，写入操作需要更新集合上的所有索引。如果您的数据库包含未使用、未充分利用或冗余的索引，则会给集群带来开销，从而导致性能下降。多个不必要的索引会产生一种反模式，从而导致性能问题、存储成本增加和运营开销增加。

**次优索引场景**
+ **未使用的索引**：为一次性查询创建的索引，或者为当前查询模式无法再访问的早期产品迭代创建的索引。要识别集合上未使用的索引，你可以使用 IndexStats。有关更多信息，请参阅 [如何分析索引使用情况并识别未使用的索引？](user_diagnostics.md#user-diag-index-usage)。
+ **冗余索引**：涵盖重叠键模式或相同查询模式的多个索引。示例：当复合索引同时涵盖属性 A 和 B 时，属性 A 上的单键索引会变得多余，因为复合索引可以单独处理对属性 A 的查询。
+ **Over-Indexing**：在不分析实际查询模式或性能要求的情况下，创建索引 “以防万一”。
+ **低基数索引：**对具有很少不同值的字段（例如布尔字段、状态标志）的索引，其查询优化优势微乎其微。

## 对集群性能的影响
<a name="low-indexes-impact"></a>
+ **存储和 IO**：每个索引都会消耗存储空间和 IO 资源，从而增加总体成本。如果索引未使用或冗余，则会给您的集群带来不必要的成本。
+ **写入性能降低**：插入、更新和删除操作必须维护索引，这会产生消耗资源的开销。未使用或冗余的索引会给这些操作增加不必要的开销。
+ **内存和 CPU 压力**：索引争夺缓冲池内存，如果工作集不适合实例内存，则索引可能会删除经常访问的数据，从而导致次优 BufferCacheHitRatio化。系统还消耗维护索引结构的 CPU 资源。

## 可用于识别指数优化机会的工具
<a name="low-indexes-tools"></a>
+ 索引审查工具：
+ 索引基数检测工具

**正在收集工具包：**

```
git clone https://github.com/awslabs/amazon-documentdb-tools.git
```

**1。索引审阅工具**

索引审查工具会分析所有集合和索引，以提供索引列表及其使用模式，并识别您的 Amazon DocumentDB 集群上的冗余索引。在所有集群实例上执行此工具以进行全面分析。有关更多信息，请参阅[索引审阅工具](https://github.com/awslabs/amazon-documentdb-tools/tree/master/performance/index-review)。

**用法：**

```
cd performance/index-review/

python3 index-review.py --server-alias <server-alias> --uri <mongodb-uri>
```

**输出文件**
+ `{server-alias}-collections.csv`: Collection-level 统计
+ `{server-alias}-indexes.csv`: 详细的索引使用指标
+ `{server-alias}-{timestamp}-index-review.json`: 用于进一步分析的原始数据

**注意**  
使用独立别名为集群中的每个实例运行以生成每个实例的统计信息，然后运行该工具以获得累积分析

例如：`python3 index-review.py --files "{server-alias}-{timestamp}-index-review.json, {server-alias}-{timestamp}-index-review.json" --server-alias full-review`

**2。索引基数检测工具**

此工具可识别基数较低、对查询性能不起作用的索引。

**用法**

```
cd performance/index-cardinality-detection/

python3 detect-cardinality.py --uri <mongodb-uri>
```

**参数**
+ `--threshold`: 基数阈值百分比（默认值：1%）
+ `--sample-count`: 要采样的文档数（默认值：100,000）
+ `--max-collections`: 每个数据库要扫描的最大集合数（默认值：100）

有关更多信息，请参阅 [https://aws.amazon.com/blogs/database/detect-and-fix-low-cardinality-indexes-in-amazon-documentdb/](https://aws.amazon.com/blogs/database/detect-and-fix-low-cardinality-indexes-in-amazon-documentdb/)。

## 补救策略
<a name="low-indexes-remediation"></a>

**1。移除未使用和冗余的索引**

```
// Example: Drop unused index
db.collection.dropIndex("unused_index_name")
```

**注意**  
如果不与所有利益相关方讨论并测试性能，就不应删除索引。

**2。低基数索引优化**
+ 将部分索引与筛选器一起使用
+ 将单个低基数索引转换为复合索引