SQL性能分析基础
1.1 慢查询日志配置
1.2 EXPLAIN执行计划解读
1.3 实时性能诊断工具
索引优化实战
2.1 最左前缀原则的陷阱
2.2 联合索引设计案例
2.3 索引失效的7种场景
高效查询编写技巧
3.1 避免全表扫描的秘诀
3.2 Join优化黄金法则
3.3 分页查询深度优化
高级优化策略
4.1 隐式类型转换灾难
4.2 子查询重构方案
4.3 大数据量更新技巧
企业级监控方案
5.1 慢SQL自动化分析
5.2 SQL审核平台搭建
sql
-- 动态开启慢查询(无需重启)
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1; -- 超过1秒的查询
SET GLOBAL log_queries_not_using_indexes = ON; -- 记录无索引查询
-- 日志分析工具使用
pt-query-digest /var/lib/mysql/mysql-slow.log > slow_report.txt
案例:某电商系统通过日志分析发现TOP3慢SQL:
sql
EXPLAIN SELECT o.order_no,u.name
FROM orders o
JOIN users u ON o.user_id = u.id
WHERE o.create_time > '2023-01-01';
重点关注指标:
错误案例:用户表索引(province, city)
sql
SELECT * FROM users WHERE city='杭州'; -- 无法使用索引
优化方案:调换字段顺序 → (city, province)
原始SQL:
sql
SELECT id,name,age FROM users WHERE city='上海' ORDER BY create_time DESC;
问题:需要回表查询
优化步骤:
(city, create_time)
(city, create_time, name, age)
WHERE phone=13800138000
(phone是varchar类型)WHERE YEAR(create_time)=2023
WHERE name LIKE '%张%'
WHERE a=1 OR b=2
(仅a有索引)WHERE LOWER(email)='[email protected]'
WHERE address IS NULL
(a,b,c)
,查询WHERE a=1 AND c=3
错误写法:
sql
SELECT * FROM 10w_rows_table BIG
JOIN 1k_rows_table SMALL ON BIG.id=SMALL.id;
优化方案:调换驱动表顺序
sql
SELECT * FROM 1k_rows_table SMALL
JOIN 10w_rows_table BIG ON SMALL.id=BIG.id;
原始分页:
sql
SELECT id,name FROM products
ORDER BY create_time DESC LIMIT 1000000, 20; -- 耗时2.8秒
优化方案(延迟关联):
sql
SELECT p.id,p.name
FROM products p
JOIN (
SELECT id FROM products
ORDER BY create_time DESC LIMIT 1000000, 20
) tmp ON p.id=tmp.id;
危险操作:
sql
UPDATE user_logs SET status=1 WHERE create_time < '2020-01-01'; -- 影响500w行
安全方案:
sql
-- 分批更新(每次处理1000条)
WHILE EXISTS(SELECT 1 FROM user_logs WHERE create_time < '2020-01-01' LIMIT 1) DO
UPDATE user_logs SET status=1
WHERE create_time < '2020-01-01' LIMIT 1000;
COMMIT;
SLEEP 1; -- 避免主从延迟
END WHILE;
低效查询:
sql
SELECT * FROM orders
WHERE user_id IN (
SELECT id FROM users WHERE vip_level > 3
);
优化方案:
sql
SELECT o.* FROM orders o
WHERE EXISTS (
SELECT 1 FROM users u
WHERE u.id=o.user_id AND u.vip_level > 3
);
mermaid
graph TD
A[慢查询日志] --> B[pt-query-digest解析]
B --> C[生成TOP SQL报告]
C --> D[开发团队优化]
D --> E[性能对比测试]
E --> F[上线验证]
通过本文10个真实案例,我们深入剖析了SQL优化的核心要点: