sql优化之合理安排顺序

今天在查看每天程序的性能报表时,发现一个url访问速度略慢,深入查找原因后发现是由于一个sql语句的问题引起的,记录在此。

1. 应用场景

业务的场景相对简单,是一个表A与表B的多对多映射,使用了表C记录这种映射关系。

2. 问题分析

原来的sql语句如下:

select * from A as tableA
inner join
(select AID, BID from C) as temp
on temp.AID = tableA.AID
where B.BID = 123
orderby XXX DESC
limit 3;

一个挺简单的业务,A,B表的数据量也不大,大概只在10W左右,但是整个SQL执行下来竟然要差不多100MS,通过explain查看执行计划,如下:

《sql优化之合理安排顺序》 慢查询1

虽然表C中索引都有,但是由于中间那句
(select AID, BID from C) as temp的原因,导致整张表被扫描了一遍,索引完全失效。

3. 解决方法

既然已经分析出了问题所在,解决思路也就很明显了,即想法办命中索引。就着这个思路,将sql语句稍作修改如下:

select * from A as tableA
where a.ID in
(select AID from C where BID = 123) 
orderby XXX DESC
limit 3;

通过explain之后可以看到执行计划如下:

《sql优化之合理安排顺序》 优化后查询

非常好的命中索引,执行时间也提升了近十倍。

    原文作者:丨飞翔的蛋花丨
    原文地址: https://www.jianshu.com/p/67dfc305e987
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞