慢查询分析与定位-- MySQL开启慢查询日志 SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 1; -- 超过1秒记录 SET GLOBAL log_queries_not_using_indexes ON; -- 使用EXPLAIN分析执行计划 EXPLAIN SELECT * FROM users WHERE age 30; -- 使用SHOW PROFILE分析执行细节 SET profiling 1; SELECT * FROM orders WHERE user_id 100; SHOW PROFILE FOR QUERY 1;关键关注点typeALL全表扫描→ index/range/refkey是否使用索引rows扫描行数越少越好ExtraUsing filesort、Using temporary需优化
常见SQL优化场景场景1避免SELECT*-- 反例查询所有字段可能回表 SELECT * FROM users WHERE age 30; -- 优化只查询需要的字段 SELECT id, name FROM users WHERE age 30;场景2避免大表JOIN-- 反例大表JOIN导致性能问题 SELECT * FROM orders o JOIN users u ON o.user_id u.id WHERE u.create_time
; -- 优化先过滤再JOIN或使用子查询 SELECT * FROM orders o WHERE o.user_id IN (SELECT id FROM users WHERE create_time
-
;场景3分页优化-- 反例OFFSET过大导致性能差 SELECT * FROM orders ORDER BY id LIMIT 1000000, 20; -- 优化使用WHERE条件索引 SELECT * FROM orders WHERE id 1000000 ORDER BY id LIMIT 20;场景4避免IN/OR导致索引失效-- 反例IN条件过多或OR导致索引失效 SELECT * FROM users WHERE status IN (1,2,3,4,5,6,7,8,9,
; -- 优化使用UNION或改写为范围查询 SELECT * FROM users WHERE status 1 UNION ALL SELECT * FROM users WHERE status 2 ...