本页是 PmaControl 的原创文档。它保留了用于 MySQL 优化工作的实用索引结构,不复制第三方内容,也不依赖外部产品。
目标
架构检查用于发现生产中代价高的结构:缺失索引、过大的列、缺失主键、历史 MyISAM 表以及未使用的索引。
检查项
- 没有主键的 InnoDB 表。
- 重复或高度冗余的索引。
- 在过宽索引中使用的
VARCHAR或TEXT列。 - 连接列类型或排序规则不同。
- 大型表没有归档策略。
- 业务完整性需要但缺少 foreign keys。
有用查询
SELECT table_schema, table_name
FROM information_schema.tables t
WHERE engine = 'InnoDB'
AND table_schema NOT IN ('mysql', 'performance_schema', 'information_schema', 'sys')
AND NOT EXISTS (
SELECT 1
FROM information_schema.table_constraints c
WHERE c.table_schema = t.table_schema
AND c.table_name = t.table_name
AND c.constraint_type = 'PRIMARY KEY'
);
要点
有价值的架构检查会把每个异常关联到查询、执行计划或可度量的运维成本。
盘点大小、引擎和负责人
从关键业务表及访问它们的查询开始,记录表的用途、保留策略、写入速率和维护窗口。结构元数据只能筛选候选问题,不能证明存在性能故障。InnoDB 的行数和大小是估算值,适合排序,不适合精确核算。不要仅为让盘点显得精确而执行昂贵的全表计数。
SELECT table_schema, table_name, engine, table_rows,
ROUND(data_length / 1024 / 1024, 1) AS data_mib,
ROUND(index_length / 1024 / 1024, 1) AS index_mib
FROM information_schema.tables
WHERE table_type = 'BASE TABLE'
AND table_schema NOT IN ('mysql', 'sys', 'performance_schema',
'information_schema')
ORDER BY data_length + index_length DESC
LIMIT 20;
结合实际负载评估索引候选项
SELECT table_schema, table_name, redundant_index_name,
dominant_index_name
FROM sys.schema_redundant_indexes
WHERE table_schema NOT IN ('mysql', 'sys');
SELECT object_schema, object_name, index_name
FROM sys.schema_unused_indexes
WHERE object_schema NOT IN ('mysql', 'sys');
这些 MySQL sys 视图要求已安装 sys schema,并具备相关采集数据。“未使用”仅针对已观测的负载:还应覆盖报表、月末任务、复制节点读取和故障切换后的角色。删除前检查唯一性及外键依赖。前缀重叠只是审核候选项,不是自动删除指令。MySQL 8+ 中符合条件的索引可先在受控测试中设为不可见,但仍会产生写入维护成本。
检查访问路径和列兼容性
SELECT table_name, column_name, column_type, is_nullable,
character_set_name, collation_name
FROM information_schema.columns
WHERE table_schema = 'app'
ORDER BY table_name, ordinal_position;
EXPLAIN FORMAT=JSON
SELECT id, created_at
FROM app.orders
WHERE customer_id = 42
ORDER BY created_at DESC
LIMIT 20;
将 app.orders 及列名替换为真实的典型查询。查看候选索引、实际选用索引、估算行数、残余过滤和排序。此例中以 (customer_id, created_at) 开头的索引可作为测试候选项,不能视作通用处方。连接列应匹配类型、有无符号、字符集和排序规则。隐式转换或索引列上的函数可能改变访问路径。采用真实的参数分布验证计划,包括数据量大的租户。
分类结构问题
| 信号 | 如何确认 | 下一步 |
|---|---|---|
| 缺少主键 | 表定义与行身份 | 选择稳定主键并评估重建成本 |
| 冗余索引 | 定义、依赖与负载覆盖 | 执行 DDL 前测试移除影响 |
| 连接列不兼容 | 类型、排序规则与实际计划 | 验证转换及应用语义 |
将发现转化为受控迁移
- 保存
SHOW CREATE TABLE、依赖查询、外键和原执行计划。 - 针对具体 DDL 和版本估算临时磁盘、构建时间、元数据锁等待和复制影响。在线 DDL 仍可能等待元数据锁。
- 在代表性数据上测试,比较读取延迟、写入开销、大小与结果正确性。
- 明确回滚方案。重建已删除索引需要时间;结构回滚可能需要数据转换或恢复备份。