1. SQL优化实战:从执行计划到索引策略的深度解析
在金融行业摸爬滚打十年,我见过太多因为SQL性能问题导致的系统崩溃。记得去年双十一大促,某支付平台的核心交易查询突然从平均300ms飙升到8秒,整个技术团队通宵排查,最终发现是一个简单的索引缺失问题。这次经历让我深刻认识到:SQL优化不是锦上添花,而是生死存亡的关键技能。
本文将分享我在金融、电商领域积累的SQL优化实战经验,重点解析执行计划解读、索引策略设计、查询重构三大核心技能。通过真实案例演示如何将8秒的查询优化到毫秒级,这些方法在MySQL 8.0和Oracle 19c等主流数据库上都经过验证,适合DBA、开发人员和架构师参考。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 执行计划:SQL优化的显微镜
2.1 EXPLAIN命令深度解析
执行计划是理解SQL性能的关键。以这个金融交易查询为例:
sql复制EXPLAIN SELECT * FROM transactions
WHERE user_id=1001 AND amount>1000;
重点关注几个核心字段:
- type:访问类型,性能排序为system > const > eq_ref > ref > range > index > ALL
- key:实际使用的索引
- rows:预估扫描行数
- Extra:额外信息(是否使用临时表、文件排序等)
去年我们优化过一个报表查询,原始执行计划显示type=ALL(全表扫描),rows=870万。通过创建(user_id, create_time)联合索引,优化后type=range,rows=58,查询时间从2.3秒降到0.15秒。
2.2 Extra字段的隐藏信息
Extra字段常被忽视,但包含重要优化线索:
- Using index:覆盖索引,避免回表
- Using temporary:使用临时表,需优化中间结果集
- Using filesort:额外排序操作
案例:某电商平台的商品排序查询:
sql复制SELECT product_id, price FROM products
WHERE category='electronics'
ORDER BY price DESC;
初始执行计划显示Using filesort,创建(category, price)联合索引后,filesort消失,查询速度提升3倍。
2.3 索引选择性计算
索引不是越多越好,需要计算选择性:
sql复制SELECT
COUNT(DISTINCT user_id)/COUNT(*) AS selectivity
FROM transactions;
经验值:
- 选择性>0.2:强烈推荐建索引
- 0.05-0.2:酌情考虑
- <0.05:通常不需要
某用户表status字段选择性0.85,建索引反而降低性能;而region字段选择性0.12,建索引后查询提速8倍。
3. 索引设计的黄金法则
3.1 复合索引的最左前缀原则
对于(A,B,C)索引:
- 有效:WHERE A=? / WHERE A=? AND B=?
- 无效:WHERE B=? / WHERE B=? AND C=?
金融案例:交易流水表原有索引(transaction_no),查询:
sql复制SELECT * FROM transactions
WHERE user_id=1001 AND transaction_no='TX20230001';
调整为(
