【收藏级干货】MySQL SQL 调优终极指南(通俗易懂 + 实战技巧)
一条 SQL 能不能飞,全靠你调优功底!
加了索引也不快?分页查询特别慢?SQL 写了好几百行但跑出慢如龟?——你可能忽略了调优这件事!
一、什么是 SQL 调优?
SQL 调优(SQL Optimization)指的是对 SQL 查询语句进行分析、重写、结构优化、索引调整等手段,提高查询效率、降低系统资源消耗、提升整体数据库性能。
🚨 为什么要调优?
- 提高查询响应速度
- 降低服务器 CPU、内存、I/O 压力
- 支持大数据量下的稳定运行
- 降低系统崩溃风险
二、从哪里开始优化?——用 EXPLAIN 看执行计划
执行计划是 SQL 调优的起点!
EXPLAIN SELECT * FROM users WHERE age > 30;
📊 关键字段解读:
字段 | 说明 | 影响性能 |
---|---|---|
id | 查询中 SELECT 的标识 | id 越大,嵌套层级越深 |
select_type | 查询类型(SIMPLE / PRIMARY / SUBQUERY) | 越简单越好 |
type | 访问类型(ALL 最差,const 最好) | 优化重点 |
key | 实际使用的索引 | 如果为空 = 没走索引 |
rows | 预估扫描的行数 | 越小越快 |
Extra | 额外信息 | 避免 Using temporary / Using filesort |
三、SQL 调优十大核心技巧
✅ 技巧 1:使用合适的索引
-- 覆盖索引
CREATE INDEX idx_name_email ON users(name, email);
SELECT name, email FROM users WHERE name = 'Tom'; -- 避免回表
✅ 技巧 2:WHERE 子句优化写法
-- ❌ 索引失效
WHERE YEAR(create_time) = 2024
-- ✅ 索引有效
WHERE create_time >= '2024-01-01' AND create_time < '2025-01-01'
✅ 技巧 3:避免 SELECT *
-- ❌ 不推荐
SELECT * FROM orders WHERE user_id = 123;
-- ✅ 推荐
SELECT order_id, price FROM orders WHERE user_id = 123;
✅ 技巧 4:分页查询 LIMIT 优化
-- 慢:偏移越大越慢
SELECT * FROM logs ORDER BY id LIMIT 100000, 10;
-- 快:基于上次最大ID分页
SELECT * FROM logs WHERE id > 上一页最大ID ORDER BY id LIMIT 10;
✅ 技巧 5:JOIN 查询调优
SELECT u.name, o.amount
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.amount > 100;
✅ 技巧 6:子查询优化
-- 慢:嵌套子查询
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE price > 100);
-- 快:JOIN 优化
SELECT u.* FROM users u
JOIN (SELECT DISTINCT user_id FROM orders WHERE price > 100) o ON u.id = o.user_id;
✅ 技巧 7:使用 UNION ALL 替代 UNION
✅ 技巧 8:ORDER BY、GROUP BY 优化
✅ 技巧 9:合理拆分大 SQL
✅ 技巧 10:使用慢查询日志分析慢 SQL
-- 开启慢查询日志
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1;
-- 查看日志位置
SHOW VARIABLES LIKE 'slow_query_log_file';
四、SQL 调优实战案例
📍案例 1:百万级分页优化
-- 原始写法:慢
SELECT * FROM messages ORDER BY id LIMIT 100000, 10;
-- 改进写法:快
SELECT * FROM messages WHERE id > 上一页最大ID ORDER BY id LIMIT 10;
📍案例 2:函数阻断索引
-- 原始写法(索引失效)
SELECT * FROM orders WHERE DATE(created_time) = '2024-06-01';
-- 优化后写法
SELECT * FROM orders WHERE created_time >= '2024-06-01' AND created_time < '2024-06-02';
五、调优工具推荐
工具 | 说明 |
---|---|
EXPLAIN | 分析 SQL 执行计划 |
SHOW PROFILE | SQL 时间分析 |
INFORMATION_SCHEMA | 查看索引/表结构 |
slow_query_log | 捕捉慢 SQL |
pt-query-digest | 慢 SQL 聚合分析 |
六、调优黄金法则汇总
- 写 SQL 之前想清楚目标和数据量
- 让查询走索引
- WHERE 条件别用函数
- 避免 SELECT *
- 使用 EXISTS 替代 IN
- 分页优化用主键代替 OFFSET
- ORDER BY 字段加索引
- 用 EXPLAIN 分析查询计划
- 分析慢查询日志
- 避免一条 SQL 做所有事
七、引流文案推荐
- 📊 MySQL 查询太慢?看这篇就够了!
- 🚀 SQL 调优技巧合集,收藏 + 实战!
- 🔍 程序员 SQL 性能提升秘籍!
八、写在最后
调优不是锦上添花,而是系统稳定运行的保障。
SQL 写得好,系统能省一半人力!
📌 关注我,每天带你掌握底层原理,写出更强健的 Java 代码!