跳转至

MySQL 优化方案

一、SQL 与索引优化

1. 索引设计原则

  • 优先为 WHERE、ORDER BY、GROUP BY、JOIN 字段建索引
  • 联合索引遵守最左前缀(a, b, c) 支持 aa,ba,b,c,不支持 b,c
  • 区分度高的字段放前面
  • 扩展字段少而精,单表索引建议不超过 5 个。
  • 避免索引失效:不在索引列上做函数/运算、不隐式转换、LIKE '%xx' 不走普通索引。

2. SQL 写法

  • LIMIT 避免全表返回。
  • 避免 SELECT *
  • 大分页用游标或子查询优化。
  • JOIN 字段类型一致,小表驱动大表。

二、表结构优化

  • 选择合适字段类型:TINYINT 替代 INTVARCHAR(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 命中率、行锁等待。

七、优化优先级

  1. 先优化 SQL 和索引(收益最大、成本最低)。
  2. 再优化表结构。
  3. 再做架构层面的读写分离、分库分表。
  4. 最后才是加机器/换硬件。

面试答题框架

答优化题时按:SQL 层 → 表结构层 → 架构层 → 参数层 → 硬件层 说,体现层次。