2022-02-11 13:35:03
在 MySQL 中优化索引存储空间的核心目标是减少冗余、选择合适的数据类型和索引策略,从而降低磁盘占用和内存消耗,同时提升查询性能。以下是具体优化方法:
1. 选择更小的数据类型索引字段的数据类型直接影响存储大小,使用能容纳数据的最小类型可有效节省空间:
对于长文本字段(如 VARCHAR(200)),可通过前缀索引减少索引体积:
前缀太短会降低选择性(唯一值比例),导致索引效率下降。
通过计算唯一值比例评估前缀长度:SELECT COUNT(DISTINCT LEFT(email,8)) / COUNT(*) FROM users;
目标:选择能覆盖大部分唯一值的最短前缀。
多个功能重叠的索引会浪费空间并影响写入性能:
联合索引 (A,B) 已包含 A 的单列索引能力,无需单独建 idx_A。
使用工具如 pt-duplicate-key-checker 扫描冗余索引。
定期审查 information_schema.statistics,分析索引使用频率,删除未使用的索引。
联合索引的列顺序影响其可用性和紧凑性:
将过滤效率高的列(如唯一值多的列)放在前面,例如用户表中 (username, age) 比 (age, username) 更高效。
尽量让多个查询共用同一个联合索引,减少总索引数量。
避免为不同顺序创建多个组合索引(如 (A,B) 和 (B,A)),根据查询模式选择最优顺序。
查询 information_schema.statistics 或使用 performance_schema 监控索引使用情况。
删除长期未使用的索引(如通过慢查询日志确认无关联查询)。
索引不是越多越好,盲目添加会降低写入性能并增加存储开销。
保留核心查询所需的索引,删除辅助性低或冗余的索引。
InnoDB 支持索引压缩(KEY_BLOCK_SIZE 参数),适用于低基数列(如状态字段)。
通过联合索引覆盖查询所需字段,避免回表操作,减少 I/O 和内存占用。
对大表按范围或哈希分区,将索引分散到不同物理文件,提升并发性能(需结合业务场景设计)。
优化 MySQL 索引存储空间的关键在于精准设计、定期维护: