本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
低使用率和冗余索引
概述
索引可以提高工作负载的整体查询性能,但会带来成本。每个索引都消耗存储空间和 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)
补救策略
1。移除未使用和冗余的索引
// Example: Drop unused index db.collection.dropIndex("unused_index_name")
注意
如果不与所有利益相关方讨论并测试性能,就不应删除索引。
2。低基数索引优化
-
将部分索引与筛选器一起使用
-
将单个低基数索引转换为复合索引