使用STRAIGHT_JOIN优化MySQL查询性能:实战案例分析

问题背景:优化器决策失误的代价

在复杂多表关联查询中,MySQL优化器可能选择低效执行路径:

/* 原始查询(优化器选择) */
EXPLAIN
SELECT ...
FROM medical_records
JOIN exam_requests ON medical_records.request_id = exam_requests.id
LEFT JOIN medical_teams ON exam_requests.team_id = medical_teams.id
ORDER BY final_result_time DESC, id DESC;

/* 执行计划关键指标 */
| Table           | Type  | Rows    | Extra                          |
|-----------------|-------|---------|--------------------------------|
| exam_requests   | index | 4,600   | Using temporary; Using filesort|
| medical_teams   | eq_ref| 1       |                                |
| medical_records | ref   | 39      |                                |

性能痛点:

  • 临时表创建(Using temporary)
  • 二级索引回表查询增加随机I/O
  • 排序操作与临时表双重开销

排序时没有使用medical_records表的字段索引,所以我们强制使用medical_records表作为主表,就可以不创建临时表,走索引。

解决方案:STRAIGHT_JOIN强制连接顺序

/* 优化后查询 */
EXPLAIN
SELECT ...
FROM medical_records STRAIGHT_JOIN exam_requests  -- 强制连接顺序
  ON medical_records.request_id = exam_requests.id
LEFT JOIN medical_teams 
  ON exam_requests.team_id = medical_teams.id
ORDER BY final_result_time DESC, id DESC;

/* 优化后执行计划 */
| Table           | Type  | Rows     | Extra          |
|-----------------|-------|----------|----------------|
| medical_records | index | 206,180  | Using filesort |
| exam_requests   | eq_ref| 1        |                |
| medical_teams   | eq_ref| 1        |                |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值