MySQL优化是一个系统工程,需要从多个层面进行考量。以下是一个全面的优化指南,涵盖关键策略和最佳实践:
一、架构与设计优化
-
合理分库分表
- 垂直拆分:将大表按业务模块拆分(如用户表、订单表)
- 水平拆分(分片) :按时间/ID范围分散数据(如按月分表)
- 工具:ShardingSphere、Vitess
-
读写分离
- 主库处理写操作 + 多个从库处理读查询
- 中间件:ProxySQL、MaxScale
-
缓存层
- 使用Redis/Memcached缓存热点数据
- 开启MySQL查询缓存(注意:MySQL 8.0已移除)
二、SQL语句优化
-
避免低效操作
sql
-- 反例:全表扫描 SELECT * FROM users WHERE YEAR(create_time) = 2023; -- 优化:使用范围查询 SELECT * FROM users WHERE create_time >= '2023-01-01' AND create_time < '2024-01-01'; -
慎用JOIN
- JOIN表不超过3个,避免笛卡尔积
- 用EXPLAIN检查执行计划
-
分页优化
sql
-- 低效:OFFSET过大 SELECT * FROM orders LIMIT 1000000, 20; -- 高效:基于ID分页 SELECT * FROM orders WHERE id > 1000000 LIMIT 20;
三、索引优化(核心重点)
-
索引设计原则
- 为WHERE、JOIN、ORDER BY字段建索引
- 联合索引遵循最左前缀原则
- 区分度高的列前置(如
INDEX(sex, age)不如INDEX(age, sex))
-
避免索引失效场景
- 对索引列进行函数操作(
WHERE DATE(create_time)=...) - 隐式类型转换(
WHERE id = '100',id是INT) - 使用
!=、NOT IN、OR(可改用UNION)
- 对索引列进行函数操作(
-
覆盖索引
sql
-- 直接通过索引返回数据 SELECT user_id FROM orders WHERE status = 1; -- status和user_id建联合索引
四、存储引擎优化
| 特性 | InnoDB | MyISAM |
|---|---|---|
| 事务 | ✅ 支持 | ❌ 不支持 |
| 行级锁 | ✅ | ❌ 表锁 |
| 外键 | ✅ | ❌ |
| 崩溃恢复 | ✅ 完善 | ❌ 较差 |
| 适用场景 | 事务型应用、高并发写 | 只读分析 |
建议:除非只读场景,否则优先使用InnoDB
五、服务器配置调优
-
内存相关(关键参数)
ini
innodb_buffer_pool_size = 70% * 总内存 # 最重要的参数 innodb_log_file_size = 1-2GB # 大事务优化 key_buffer_size = 128M # MyISAM专用 -
IO优化
ini
innodb_flush_method = O_DIRECT innodb_io_capacity = 2000 # SSD建议值 -
连接控制
ini
max_connections = 1000 # 根据实际需求调整 thread_cache_size = 32 # 减少线程创建开销
六、运维监控
-
性能分析工具
- 慢查询日志:
slow_query_log = ON,long_query_time = 1 - 性能模式:
performance_schema - 监控工具:Percona Monitoring and Management (PMM), Prometheus+Grafana
- 慢查询日志:
-
定期维护
sql
ANALYZE TABLE orders; -- 更新统计信息 OPTIMIZE TABLE logs; -- 碎片整理(谨慎使用)
七、高级优化技术
-
异步处理
- 将耗时操作移出事务(如发邮件、记录日志)
-
批量操作
sql
-- 反例:逐条插入 INSERT INTO users (name) VALUES ('A'); INSERT INTO users (name) VALUES ('B'); -- 优化:批量提交 INSERT INTO users (name) VALUES ('A'), ('B'); -
使用物化视图
- 通过缓存复杂查询结果(如Percona Server的QUERY RESPONSE TIME)
优化流程总结
-
监控发现问题:慢查询日志、CPU/IO瓶颈
-
分析原因:
EXPLAIN、SHOW PROCESSLIST -
针对性优化:
- 修改SQL语句
- 调整索引
- 配置调参
-
测试验证:使用生产环境数据测试
-
持续监控:建立性能基线定期对比
⚠️ 重要原则:避免过度优化!80%的性能问题通常由少数几个低效SQL引起,优先解决这些瓶颈点。