View a markdown version of this page

低使用率和冗余索引 - Amazon DocumentDB

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

低使用率和冗余索引

概述

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

次优索引场景

  • 未使用的索引:为一次性查询创建的索引,或者为当前查询模式无法再访问的早期产品迭代创建的索引。要识别集合上未使用的索引,你可以使用 IndexStats。有关更多信息,请参阅 如何分析索引使用情况并识别未使用的索引?

  • 冗余索引:涵盖重叠键模式或相同查询模式的多个索引。示例:当复合索引同时涵盖属性 A 和 B 时,属性 A 上的单键索引会变得多余,因为复合索引可以单独处理对属性 A 的查询。

  • Over-Indexing:在不分析实际查询模式或性能要求的情况下,创建索引 “以防万一”。

  • 低基数索引:对具有很少不同值的字段(例如布尔字段、状态标志)的索引,其查询优化优势微乎其微。

对集群性能的影响

  • 存储和 IO:每个索引都会消耗存储空间和 IO 资源,从而增加总体成本。如果索引未使用或冗余,则会给您的集群带来不必要的成本。

  • 写入性能降低:插入、更新和删除操作必须维护索引,这会产生消耗资源的开销。未使用或冗余的索引会给这些操作增加不必要的开销。

  • 内存和 CPU 压力:索引争夺缓冲池内存,如果工作集不适合实例内存,则索引可能会删除经常访问的数据,从而导致次优 BufferCacheHitRatio化。系统还消耗维护索引结构的 CPU 资源。

可用于识别指数优化机会的工具

  • 索引审查工具:

  • 索引基数检测工具

正在收集工具包:

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

1。索引审阅工具

索引审查工具会分析所有集合和索引,以提供索引列表及其使用模式,并识别您的 Amazon DocumentDB 集群上的冗余索引。在所有集群实例上执行此工具以进行全面分析。有关更多信息,请参阅索引审阅工具

用法:

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/

补救策略

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

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

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

2。低基数索引优化

  • 将部分索引与筛选器一起使用

  • 将单个低基数索引转换为复合索引