MySQL SQL 优化(阿里实战指南)
- 慢 SQL 优化核心步骤
(1)定位慢 SQL
开启慢查询日志(阿里生产环境必配):
sql
-- 临时开启(重启失效)
SET GLOBAL slow_query_log = ON;
SET GLOBAL slow_query_log_file = '/var/lib/mysql/slow.log';
SET GLOBAL long_query_time = 1; -- 执行时间>1秒的SQL记为慢SQL
(2)分析执行计划
使用EXPLAIN分析 SQL 执行计划(核心):
sql
EXPLAIN SELECT * FROM user WHERE age > 20 AND name = '张三';
关键字段解读:
type:访问类型(ALL(全表扫描)< range(范围扫描)< ref(索引等值匹配)< eq_ref(主键等值匹配)< const(常量)),阿里要求至少达到range级别;
key:实际使用的索引(NULL 表示未使用索引);
rows:预估扫描行数(越小越好);
Extra:额外信息(Using filesort(文件排序)、Using temporary(临时表)需优化)。 - 阿里高频 SQL 优化案例
(1)优化前(全表扫描,耗时 5s)
sql
SELECT FROM order WHERE create_time >= '2025-01-01' AND status = 1;
(2)优化后(使用联合索引,耗时 0.01s)
sql
-- 1. 创建联合索引
CREATE INDEX idx_create_time_status ON order(create_time, status);
-- 2. 优化SQL(覆盖索引,避免)
SELECT id, order_no FROM order WHERE create_time >= '2025-01-01' AND status = 1;
(3)JOIN 优化(阿里规范:禁止大表 JOIN 大表)
优化原则:小表驱动大表(减少循环次数),给 JOIN 字段加索引;
示例:
sql
-- 优化前(大表驱动小表)
SELECT FROM big_table b JOIN small_table s ON b.id = s.big_id;
-- 优化后(小表驱动大表)
SELECT FROM small_table s JOIN big_table b ON s.big_id = b.id; - 阿里 SQL 编写规范(核心条款)
禁止使用SELECT ,仅查询需要的字段;
禁止大表分页使用LIMIT offset, size(offset 过大时扫描行数多),推荐 “主键分页”:
sql
-- 优化前(offset=10000,扫描10000+10行)
SELECT FROM user LIMIT 10000, 10;
-- 优化后(仅扫描10行)
SELECT * FROM user WHERE id > 10000 LIMIT 10;
禁止在 WHERE 子句中使用函数 / 运算(如DATE(create_time) = '2025-01-01');
批量操作使用INSERT INTO ... VALUES (),(),()(而非循环单条插入)。
五、MySQL 阿里云部署与调优(生产级) - 部署方案选择(阿里推荐)
方案 适用场景 阿里推荐度
阿里云 RDS MySQL 中小规模业务(开箱即用,自带高可用 / 备份) ★★★★★
ECS 自建 MySQL 大规模 / 定制化需求(如分库分表) ★★★☆☆
阿里云 PolarDB 超大规模 / 高并发(兼容 MySQL,云原生) ★★★★☆ - 阿里云 RDS 调优(核心参数)
阿里 RDS 支持通过 “参数模板” 调整 MySQL 配置,核心调优参数:
参数名 作用 阿里推荐值(4 核 8G)
innodb_buffer_pool_size InnoDB 缓存池大小(核心) 5G(物理内存的 60-70%)
max_connections 最大连接数 1000(避免连接数过高)
query_cache_type 查询缓存开关 OFF(阿里禁用:命中率低)
innodb_flush_log_at_trx_commit 事务刷盘策略 1(严格 ACID)/2(性能优先)
join_buffer_size JOIN 缓存大小 4M(按需调整) - 阿里生产环境高可用方案
(1)RDS 主从架构
核心:主库写入,从库读取(读写分离),自动故障切换;
阿里配置:RDS 控制台开启 “读写分离”,通过读写分离地址访问(如xxx.readwrite分离.mysql.rds.aliyuncs.com)。
(2)分库分表(阿里 ShardingSphere)
适用于单表数据量超 1000 万的场景,核心策略:
水平分表:按主键哈希(如id % 10分 10 表);
垂直分库:按业务模块拆分(如订单库、用户库);
阿里实战:使用 ShardingSphere-JDBC 实现客户端分库分表(无中间件,性能高)。
(3)备份与恢复(阿里必配)
自动备份:RDS 开启 “自动备份”(保留 7 天以上);
增量备份:开启 binlog(log_bin = ON),支持时间点恢复(PITR);
阿里建议:定期做 “全量备份 + binlog 备份”,避免数据丢失。