尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

MySQLTuner 索引体检:基于 Performance Schema 的未使用索引与冗余索引检测指南

发布时间:2026/9/26 10:02:46

资讯中心
01
ARTICLE

MySQLTuner 索引体检:基于 Performance Schema 的未使用索引与冗余索引检测指南

MySQLTuner 索引体检:基于 Performance Schema 的未使用索引与冗余索引检测指南
数据库运维【免费下载链接】MySQLTuner-perlMySQLTuner is a script written in Perl that will assist you with your MySQL configuration and make recommendations for increased performance and stability.项目地址https://gitcode.com/gh_mirrors/my/MySQLTuner-perl点击查看免费下载导读本文围绕 MySQLTuner-perl 项目中 index_checks_pfs 规格文档 展开深入讲解如何借助performance_schema与sysschema 的schema_unused_indexes、schema_redundant_indexes视图自动识别数据库中的未使用索引与冗余索引并输出可执行的优化建议与建模发现。读完本文你将掌握这两项索引体检指标的数据来源、作用范围、判定逻辑、源码实现细节与测试验证方法并能在实际 MySQL / MariaDB 环境中正确启用与解读相关结果。一、为什么需要检测未使用索引与冗余索引索引是 MySQL 查询性能的核心加速器但也是一把双刃剑未使用索引Unused Index从未被任何查询访问的索引白白占用磁盘空间并在每次 DMLINSERT / UPDATE / DELETE时产生额外的写入开销与缓冲池内存占用冗余索引Redundant Index两个或多个索引共享相同的前缀列功能互相重叠。例如idx(a)与idx(a,b)中前者即可被后者覆盖。冗余索引会增加写入成本、拖慢统计信息更新却几乎不带来查询收益。传统做法是人工通过information_schema.STATISTICS手工比对索引定义工作量大且容易遗漏。MySQLTuner-perl 的做法则完全不同它直接利用 MySQL 官方sysschema 中已经计算好的两个视图把哪些索引没用、哪些索引重复的判定交给数据库引擎再结合自身报表框架输出为可执行建议。从源码结构看这一功能被设计为mysql_pfs子程序的一部分详见 mysqltuner.pl与全表扫描、临时表、文件 IO 延迟等 Performance Schema 指标并列作为可观测性体检的一个环节。二、规格总览两个新指标根据 index_checks_pfs 规格文档本次增强的核心目标是当performance_schema与sysschema 均可用时为未使用索引与冗余索引提供可操作的优化建议recommendation和建模发现modeling finding。两个新指标及其数据来源如下指标数据源视图作用范围触发动作未使用索引Unused Indexessys.schema_unused_indexes所有用户 schema排除performance_schema、mysql、information_schema、sys计数 0 时写入generalrec建议、写入modeling明细、CLI 输出汇总冗余索引Redundant Indexessys.schema_redundant_indexes所有用户 schema计数 0 时写入generalrec建议、写入modeling明细、CLI 输出汇总注意两个指标在排除系统库上的差异未使用索引的查询在 SQL 层显式过滤系统 schema见下文源码而冗余索引视图本身在定义上主要面向用户表规格文档对两者的 scope 描述也因此略有不同。三、指标一未使用索引Unused Indexes3.1 数据来源与判定原理schema_unused_indexes视图基于performance_schema.table_io_waits_summary_by_index_usage统计表实现当某索引的累计读写计数COUNT_STAR为 0 时即被判定为未使用。它反映了自实例启动 / PFS 统计重置以来该索引从未被任何访问路径触碰这一事实。3.2 实际查询语句MySQLTuner-perl 在 mysqltuner.pl 中执行的完整 SQL 为select CONCAT(object_schema, ., object_name, (, index_name, )) from sys.schema_unused_indexes where object_schema not in (performance_schema, mysql, information_schema, sys);CONCAT把库名.表名 (索引名)拼成一行可读文本便于后续正则解析WHERE object_schema NOT IN (...)显式排除四个系统库确保只体检用户数据查询结果通过select_array逐行取回不限制行数上限全部未使用索引都会列出。3.3 触发后的三个动作规格文档规定计数 0 时执行三类动作源码实现与之完全一致mysqltuner.pl写入通用建议generalrecUnused indexes found: X index(es) should be reviewed and potentially removed.写入建模发现modeling对每个未使用索引生成一条结构化明细包含type unused_index、schema、table、index以及可直接执行的ALTER TABLE 库.表 DROP INDEX 索引语句。源码通过正则^(.*?)\.(.*?)\s\((.*?)\)$从 CONCAT 结果中还原三个字段。CLI 输出汇总badprint Performance schema: X unused index(es) found.即当发现未使用索引时按BAD级别提示若计数为 0则输出No information found or indicators deactivated.。四、指标二冗余索引Redundant Indexes4.1 数据来源与判定原理schema_redundant_indexes视图基于sys.x$schema_flattened_keys展开后的索引列信息自动比较同一张表内各索引的列前缀关系识别出冗余于另一索引的索引并在sql_drop_index列中预生成安全的 DROP INDEX 语句。这意味着 MySQL 官方已经把哪条索引该删、怎么删都算好了。4.2 实际查询语句对应实现位于 mysqltuner.plselect CONCAT(table_schema, ., table_name, (, redundant_index_name, ) redundant of , dominant_index_name, - SQL: , sql_drop_index) from sys.schema_redundant_indexes;相比未使用索引这条查询额外带回了dominant_index_name主导索引与sql_drop_index官方推荐的删除语句信息更完整。4.3 触发后的三个动作与未使用索引对称mysqltuner.pl写入通用建议generalrecRedundant indexes found: X index(es) should be reviewed and potentially removed.写入建模发现modeling每个冗余索引生成包含type redundant_index、schema、table、index冗余索引名、dominant_index主导索引名、sql官方 DROP 语句的哈希结构。源码使用正则^(.*?)\.(.*?)\s\((.*?)\)\sredundant\sof\s(.*?)\s-\sSQL:\s(.*)$解析。CLI 输出汇总badprint Performance schema: X redundant index(es) found.无发现时输出提示信息。五、源码级实现细节5.1 功能挂载点mysql_pfs子程序从源码结构看两项检查被集成在mysql_pfs子程序中mysqltuner.pl其执行前置条件为return if ( $opt{pfstat} 0 );即只有--pfstatPerformance Schema 统计被启用时才会进入该子程序。子程序内部对performance_schema与sys的存在性做了两级判定与规格文档的三个用户场景一一对应详见第六节。5.2 数据获取方式select_array规格文档明确要求使用select_array从sysschema 视图获取数据。这是项目长期保持的单文件架构下的统一数据访问惯例所有 PFS 相关查询均通过select_array批量取行、select_one取单值如select sys_version from sys.version保证了错误处理与输出格式的一致性。5.3 系统库过滤的一致性设计在 mysqltuner.pl 中项目维护了一张%sys_schema_filter_cols映射表把每个 sys 视图映射到其所属库字段schema_unused_indexes object_schemaschema_redundant_indexes table_schema并统一定义排除列表mysql,information_schema,performance_schema,sys。这从侧面印证了范围限定在用户 schema的规格意图——未使用索引查询直接在 SQL 里加WHERE过滤而其他 schema-aware 查询则通过动态拼接$sys_db_filter_os/$sys_db_filter_ts等过滤器实现两者殊途同归。5.4 建模输出Modeling Findings的作用写入modeling的哈希结构是该项目的机器可读诊断载体典型形态为{ type unused_index, schema test_db, table users, index idx_unused, sql ALTER TABLE test_db.users DROP INDEX idx_unused, }以及{ type redundant_index, schema test_db, table orders, index idx_redundant, dominant_index idx_dominant, sql ALTER TABLE test_db.orders DROP INDEX idx_redundant, }这种结构化输出让下游 Agent、MCP 工具或自动化运维平台可以直接解析并执行而无需再解析 CLI 文本。六、三种用户场景与行为对照规格文档明确给出了三种场景源码也逐一落实场景条件行为场景 1performance_schema为 OFF不执行任何索引体检维持既有行为并提示Performance_schema should be activated (observability issue)向adjvars推荐performance_schemaON场景 2performance_schema为 ON但sysschema 缺失不执行索引体检输出Sys schema is not installed.并建议安装 sys schemaMySQL 指向 mysql/mysql-sysMariaDB 指向 FromDual/mariadb-sys随后直接return场景 3performance_schema为 ON 且sysschema 存在执行未使用索引与冗余索引两项检查并按第二节/第三节描述的规则输出建议与建模发现场景 3 还会先打印Sys schema Version: 版本号通过select sys_version from sys.version便于判断 sys schema 的版本兼容性。七、测试验证如何证明这两项检查真的在工作仓库为此提供了专门的回归测试 tests/index_pfs_checks.t它把mysqltuner.pl作为 Perl 库加载mock 掉select_array/select_one等数据访问函数后直接调用main::mysql_pfs()。mock 数据设计如下%mock_queries ( SHOW DATABASES [mysql, information_schema, performance_schema, sys, test_db], sys.schema_unused_indexes [test_db.users (idx_unused)], sys.schema_redundant_indexes [test_db.orders (idx_redundant) redundant of idx_dominant - SQL: ALTER TABLE test_db.orders DROP INDEX idx_redundant], );随后逐项断言共 6 个断言generalrec中出现Unused indexes found: 1 index(es) should be reviewed...mock 输出中出现BAD: Performance schema: 1 unused index(es) foundmodeling中存在type eq unused_index的哈希generalrec中出现Redundant indexes found: 1 index(es) should be reviewed...mock 输出中出现BAD: Performance schema: 1 redundant index(es) foundmodeling中存在type eq redundant_index的哈希。此外tests/sql_quoting.t 还验证了冗余索引查询在通过mysql -Bse执行时双引号/反引号的转义正确性保证这条 SQL 在真实命令行环境下可被正确传递。八、CLI 开关与运行方式8.1 相关命令行选项两项检查属于 Performance Schema 统计功能的一部分受--pfstat主开关控制。同时release 记录显示项目为 schema 相关视图提供了一组细粒度开关见 releases/v2.8.45.md 与 releases/v2.9.0.md其中与本文直接相关的两个为--schema_unused_indexes启用/禁用未使用索引检查--schema_redundant_indexes启用/禁用冗余索引检查。这类--schema_*开关与%sys_schema_filter_cols映射中的视图一一对应允许用户按需裁剪体检项。8.2 典型运行示例# 完整体检包含 PFS 与索引检查 perl mysqltuner.pl --pfstat # 仅查看未使用索引与冗余索引相关输出 perl mysqltuner.pl --pfstat --schema_unused_indexes --schema_redundant_indexes # 通过 socket 连接并指定用户 perl mysqltuner.pl --socket /var/run/mysqld/mysqld.sock --user root --pass *** --pfstat运行前提MySQL 5.7 或带sysschema 的 MariaDB实例中performance_schema ON已安装sysschemaMySQL 8.0 默认自带连接账号具备查询sys视图的权限通常为SELECTonsys.*或performance_schema相关权限。CLI 输出中索引相关段落在Performance schema子标题下分别显示Unused indexes与Redundant indexes两个小节每行一个索引若发现问题会伴随 BAD 级别的汇总提示。九、兼容性与注意事项版本兼容规格文档明确要求兼容 MySQL 5.7 与 MariaDB在 sys schema 可用前提下。两个视图在 MySQL 5.7 起引入MariaDB 用户需自行安装 FromDual/mariadb-sys 兼容实现。统计口径schema_unused_indexes的判定依赖 PFS 累计统计实例重启或TRUNCATE performance_schema会重置计数——刚重启的实例可能误报全部未使用建议在稳定运行一段时间后再参考该结论。删除前的复核虽然冗余索引视图已预生成sql_drop_indexMySQLTuner-perl 的输出定位仍是建议review and potentially remove而非直接执行生产环境删除索引前应结合真实查询模式复核。单文件架构所有逻辑位于 mysqltuner.pl 这一单个 Perl 文件中未引入额外模块便于部署与审计。十、总结基于 Performance Schema 的索引体检是 MySQLTuner-perl 可观测性能力的重要一环。它把未使用索引与冗余索引两个 DBA 高频关注的优化点从人工比对information_schema的繁琐工作抽象为两次对sys视图的查询并统一输出为三类结果CLI 汇总人可读、generalrec建议通用优化清单、modeling结构化明细机器可执行。配合 tests/index_pfs_checks.t 的回归测试这一能力的正确性得到了持续保障。对于正在运维 MySQL / MariaDB 的团队建议将--pfstat --schema_unused_indexes --schema_redundant_indexes纳入定期巡检脚本并结合删除前复核的纪律让每一个冗余索引的清理都建立在数据证据之上。赞分享数据库运维【免费下载链接】MySQLTuner-perlMySQLTuner is a script written in Perl that will assist you with your MySQL configuration and make recommendations for increased performance and stability.项目地址https://gitcode.com/gh_mirrors/my/MySQLTuner-perl点击查看免费下载相关推荐MongoDB索引使用统计Robo 3T识别未使用的冗余索引MongoDB索引使用统计Robo 3T识别未使用的冗余索引 在MongoDB数据库优化中冗余索引会导致写入性能下降和存储空间浪费。Robo 3T作为跨平台数据库客户端桌面应用Search_Engine 反向索引搜索基于 SQLite 与倒排索引的多文档检索实现指南Search_Engine 反向索引搜索基于 SQLite 与倒排索引的多文档检索实现指南 导读 本文围绕本仓库中 Search_Engine 模块完整讲解示例工程turf/geojson-rbush 空间索引实战指南基于 RBush 的 GeoJSON 高效检索与碰撞检测turf/geojson rbush 空间索引实战指南基于 RBush 的 GeoJSON 高效检索与碰撞检测 turf/geojson rbush 是数据分析上一篇Dispatch-Proxy 项目常见问题解决方案下一篇三步完成AI 3D生成Hunyuan3D-2本地部署终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。