识别冗余和重复的索引,同时忽略主键和外键并检查其基数。在 AWS RDS 环境中删除 AWS RDS MySQL 数据库上的索引的最佳实践是什么?
我的环境(上下文):AWS RDS Aurora MySQL 8.0 目的是降低存储成本并改善 INSERT/UPDATE/DELETE 事务。
识别冗余和重复的索引,同时忽略主键和外键并检查其基数。在 AWS RDS 环境中删除 AWS RDS MySQL 数据库上的索引的最佳实践是什么?
我的环境(上下文):AWS RDS Aurora MySQL 8.0 目的是降低存储成本并改善 INSERT/UPDATE/DELETE 事务。
主题 1:重复索引
无需使用其他工具,您可以使用sys.schema_redundant_indexes
以下是 MySQL 5.7.37 中的情况:
建议删除的索引是
其他列可帮助您解释为什么可以删除它们。
如果你想更深入地研究这个问题,我强烈建议你使用pt-duplicate-key-checker工具。为什么?这是它将输出的内容
对于使用 MySQL 8.0+ 的用户
在删除任何重复索引之前,您应该先看看您的查询是否可以在没有它们的情况下运行。例如,如果您有一个名为的表
mydb.mytable
,并且有一个名为的重复索引index99
,则可以向查询优化器隐藏该索引的存在,如下所示:然后,让您的查询继续进行。如果查询性能相同,那么您可以删除索引:
否则,保留索引:
注意:这些原则适用于 RDS、Aurora、本地虚拟机和裸机。
船长日志:补充
重复索引和冗余索引之间的区别在于
主题 2:基数如何???
你可以运行
这将为您提供单列的基数,然后按 2 列、3 列等分组。
假设您在 中有 3 列 (a,b,c) 的索引
mydb.mytable
。您可以像这样获取这三列的基数:这样您就可以了解哪些 3 元组会使用索引,哪些不会。如果
cnt
3 元组的列占表的 5% 以上,索引将被忽略,您将看到全索引扫描或全表扫描。