暂无图片
暂无图片
5
暂无图片
暂无图片
2
暂无图片

MySQL 有没有类似 Oracle 的索引监控功能?

184

大家好,我是 JiekeXu,江湖人称“强哥”,青学会 MOP 技术社区主席,荣获 Oracle ACE Pro 称号,墨天轮 MVP,墨天轮年度“墨力之星”,拥有 Oracle OCP/OCM 认证,MySQL 5.7/8.0 OCP 认证以及 PCA、PCTA、OBCA、OGCA、金仓KCA、KCP 等众多国产数据库认证证书,今天和大家一起来看看 MySQL 有没有类似 Oracle 的索引监控功能?欢迎关注我的微信公众号“JiekeXu DBA之路”,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!

ACEWeixinID.png

前 言

今天有同事问, MySQL 8.0 有没有类似 Oracle 的索引监控功能。于是我回忆了一下 Oracle 的索引监控是怎么工作的。记得 Oracle 可以通过 ALTER INDEX … MONITORING USAGE 来监控索引是否被使用,然后普通用户通过查询 V$OBJECT_USAGE 视图查看结果,好像 12c 及以上新增了 dba_object_usage 视图可以通过 SYSDBA 用户查看,具体可查看我以前写的一篇 Oracle 索引监控。那麽 MySQL 有没有类似的功能呢?


0. 小 记

记得在 MySQL 中,Performance_Schema 下有一个表叫做 table_io_waits_summary_by_index_usage,这个表可以统计索引的使用情况,包括读取、写入的次数。

另外,这个统计数据是基于性能模式的数据,而默认情况下性能模式是开启的,但如果没开启的话需要先配置。同时,统计的数据是累积的,重启后会重置,所以需要定期监控或者设置持久化的收集。

还有,需要注意索引的使用统计可能不包括某些情况,比如如果查询使用了索引覆盖,可能不会统计到具体的访问次数?

总结来说,MySQL 8.0 虽然没有和 Oracle 完全相同的命令,但通过Performance Schema 可以实现类似的监控功能。下面详细说明如何查询table_io_waits_summary_by_index_usage 表,并给出示例查询,同时指出注意事项,比如需要启用 performance_schema,数据重置的问题,以及可能的统计限制。

MySQL 8.0 虽然没有完全等同于 Oracle 的 ALTER INDEX ... MONITORING USAGE 语法,但可以通过 Performance SchemaInformation Schema 实现类似的索引使用监控功能。以下是具体方法及示例:


1. 使用 Performance Schema 监控索引

MySQL 的 performance_schema 提供了表 table_io_waits_summary_by_index_usage,可统计索引的 I/O 操作(如读取、写入次数),从而间接监控索引的使用情况。

操作步骤

1). 确保 Performance Schema 已启用

SHOW VARIABLES LIKE 'performance_schema'; -- 默认应为 ON
复制

2). 查询索引使用统计

SELECT OBJECT_SCHEMA AS `Database`, OBJECT_NAME AS `Table`, INDEX_NAME AS `Index`, COUNT_READ AS `Reads`, COUNT_WRITE AS `Writes`, COUNT_FETCH AS `Fetches` FROM performance_schema.table_io_waits_summary_by_index_usage WHERE INDEX_NAME IS NOT NULL -- 排除全表扫描 AND OBJECT_SCHEMA='db_mps_certificate' ORDER BY COUNT_READ + COUNT_WRITE DESC;
复制
  • 关键字段
    • COUNT_READ:通过索引读取的次数。
    • COUNT_WRITE:通过索引写入的次数。
    • COUNT_FETCH:通过索引检索的次数。

2. 使用 sys Schema 简化分析

MySQL 8.0 内置的 sys Schema 提供了更友好的视图。例如,sys.schema_index_statistics 可直接查看索引使用统计:

SELECT table_name, index_name, rows_selected, rows_inserted, rows_updated, rows_deleted FROM sys.schema_index_statistics WHERE table_schema = 'db_mps_certificate'; --information_schema.STATISTICS and sys.schema_index_statistics select a.TABLE_NAME, a.INDEX_NAME, group_concat( a.COLUMN_NAME order by a.SEQ_IN_INDEX ), b.rows_selected from information_schema.STATISTICS a, sys.schema_index_statistics b where a.TABLE_SCHEMA = b.table_schema and a.TABLE_NAME = b.table_name and a.INDEX_NAME = b.index_name and a.TABLE_SCHEMA = 'db_mps_certificate' group by a.TABLE_NAME, a.INDEX_NAME, b.rows_selected limit 100;
复制

注意:在 MySQL 8.0.30 及更高版本中,有关生成的不可见主键列的信息默认在 information_schema.STATISTICS 表中可见。可以通过设置 show_gipk_in_create_table_and_information_schema = OFF 来隐藏这些信息。


3. 手动重置统计

统计信息会在 MySQL 重启后重置,也可手动重置以重新收集数据:

TRUNCATE TABLE performance_schema.table_io_waits_summary_by_index_usage;
复制

4. 通过慢查询日志分析

启用慢查询日志,结合 EXPLAIN 分析未使用索引的查询:

-- 启用慢查询日志 SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 2; -- 记录超过两秒的慢查询 SET GLOBAL log_queries_not_using_indexes = 'ON'; -- 分析日志 SHOW VARIABLES LIKE 'slow_query_log_file';
复制

5. 注意事项

1). 覆盖索引(Covering Index):如果查询仅通过索引即可获取数据(无需回表),统计可能不会更新 COUNT_READ
2). 统计粒度:数据为累计值,适合长期监控,短期分析需手动重置。
3). 性能影响:启用 performance_schema 对性能影响极小,但需确保其已开启。


6. 总结

MySQL 8.0 通过 performance_schemasys Schema 提供了索引使用监控的能力,虽然语法与 Oracle 不同,但功能上可满足需求。建议定期检查未使用的索引并优化删除,以提升性能。

7. 参考链接

https://dev.mysql.com/doc/refman/8.0/en/performance-schema-table-wait-summary-tables.html#performance-schema-table-io-waits-summary-by-index-usage-table
https://dev.mysql.com/doc/refman/8.0/en/sys-schema-index-statistics.html
https://dev.mysql.com/doc/refman/8.0/en/information-schema-statistics-table.html
复制

全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

❤️ 欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!
——————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
ITPUB:https://blog.itpub.net/69968215
腾讯云:https://cloud.tencent.com/developer/user/5645107
——————————————————————————

facebook_pro_light_1920 × 1080  副本.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论

筱悦星辰
暂无图片
4天前
评论
暂无图片 0
不过度在意他人的看法,把时间和精力还给自己。
4天前
暂无图片 点赞
评论
淡定
暂无图片
7天前
评论
暂无图片 0
MySQL 有没有类似 Oracle 的索引监控功能?
7天前
暂无图片 点赞
评论