MySQL 优化方案¶
一、SQL 与索引优化¶
1. 索引设计原则¶
- 优先为 WHERE、ORDER BY、GROUP BY、JOIN 字段建索引。
- 联合索引遵守最左前缀:
(a, b, c)支持a、a,b、a,b,c,不支持b,c。 - 区分度高的字段放前面。
- 扩展字段少而精,单表索引建议不超过 5 个。
- 避免索引失效:不在索引列上做函数/运算、不隐式转换、
LIKE '%xx'不走普通索引。
2. SQL 写法¶
- 用
LIMIT避免全表返回。 - 避免
SELECT *。 - 大分页用游标或子查询优化。
JOIN字段类型一致,小表驱动大表。
二、表结构优化¶
- 选择合适字段类型:
TINYINT替代INT,VARCHAR(N)按业务最大值设。 - 避免 NULL(难优化,占额外空间)。
- 大字段(TEXT/BLOB)拆到扩展表。
- 冷热数据分离。
三、架构优化¶
1. 读写分离¶
主库写,从库读。见 MySQL 读写分离。
2. 分库分表¶
见 分库分表能否无限扩容。
3. 缓存¶
热点数据放 Redis,减少数据库压力。注意缓存与数据库一致性。
四、参数优化¶
| 参数 | 建议 | 说明 |
|---|---|---|
innodb_buffer_pool_size |
物理内存 50%~70% | InnoDB 最重要参数 |
innodb_log_file_size |
几个 G | redo log 大小 |
max_connections |
500~2000 | 按业务调整 |
innodb_flush_log_at_trx_commit |
1(安全)/2(性能) | 影响持久性 |
sync_binlog |
1(安全)/0(性能) | 同上 |
slow_query_log |
开启 | 抓慢 SQL |
五、硬件与系统¶
- SSD:随机 IO 提升 10 倍以上。
- 足够内存:让热数据全部在 Buffer Pool。
- 网卡、磁盘带宽评估。
- 关闭 swap,避免性能抖动。
六、监控¶
- 慢查询日志:长期跟踪。
- Performance Schema:查看 SQL 耗时、锁等待。
- 监控指标:QPS、TPS、连接数、主从延迟、Buffer Pool 命中率、行锁等待。
七、优化优先级¶
- 先优化 SQL 和索引(收益最大、成本最低)。
- 再优化表结构。
- 再做架构层面的读写分离、分库分表。
- 最后才是加机器/换硬件。
面试答题框架
答优化题时按:SQL 层 → 表结构层 → 架构层 → 参数层 → 硬件层 说,体现层次。