大家好,我是 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之路”,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!
前 言
今天有同事问, 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 Schema 和 Information 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_schema
和 sys
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
——————————————————————————
文章被以下合辑收录
评论

