今天帮同事看了一个满查询问题,事情经过是这样的
之前很早的一个项目,查询逻辑写到了存储过程里面,大概有5个表,主表a,join b,c,d,子查询e,大概如下:
以下内容都在存储过程里面
select a.* ,b.id,c.id
from a
join b on a.id = b.aid
join c on b.id = c.bid
join d on c.id = d.did
join (select sum(stock),e.aid from group by e.aid)e on a.id = e.aid
一开始几次的查询,都挺快,但是差不多到了第四次,就慢了,然后觉得很奇怪,一开始觉得是数据的问题,把第一次存储(快)跟慢的存储(慢),最终的sql语句,拷贝出来,发现就差在一个id范围的问题,重新运行了两遍sql语句,发现sql又都很慢,然后就纳闷了,为啥存储里面很快,拷贝出来同样的语句,却很慢。
考虑了一下,还是觉得应该看一下语句本身的问题,用最基础的语句,explain 。。。。。,发现其中a,d都没有用索引,都是全表扫描的,a标识3w+数据,d是7w+的数据,这就有意思了,会不会是子查询不用索引呢???心里打了问号
然后换成了left join e表,又explain 了一下,发现e表就用索引了,速度就快了。。。