mysql explain字段解释

仅转载大佬博主的解释,记录一下MySQL 高级–优化 —— explain

有一段sql需要将其优化至10s内,研究后并针对自身sql进行应用。
优化前sql

select a.namenew as name,a.lon,a.lat,a.count
from (select t.name,concat(t.name,'(',t.district,'-',t.RegionName,')') as namenew,max(t.lon) as lon,max(t.lat) as lat,round(avg(d.count),0) as count from  v_user_road t inner join road_day d on t.roadid = d.roadid 
where d.posttime >= '2023-10-09 00:00:00' and d.posttime <='2023-10-09 00:00:00' and t.User_Id = 2 and t.name like '%南%' group by t.district,t.RegionName,t.name) a  
order by a.count desc 

优化前的执行计划
在这里插入图片描述
从这张图中可以看到,第四行type=‘ALL’ 并且Extra中有‘Using join buffer (Block Nested Loop)’,表示全表扫描并且有嵌套循环,估计这里是造成慢的原因。
由于我对这个表没有建立索引等权限,故而考虑跳过循环。由sql可看出需要查询视图,此视图涉及到的表包括road表(图中table s)、user_district表(图中table r),district_region表(图中table t),sql代码里的road_day 里的roadid 需要与v_user_road的roadid连接,故而考虑直接将road_day的roadid与road的roadid连接,并且使用exists判断roadid是否存在于v_user_road表中。sql如下

 select concat(t.name,'(',t.district,'-',t.RegionName,')') as name,max(t.lon) as lon,max(t.lat) as lat,round(avg(d.count),0) as count  
 from road t inner join road_day d on t.roadid=d.roadid 
  where exists (select roadid from v_user_roadv where v.roadid=t.roadid and user_id=2  and name like '%南%') and d.posttime >= '2023-10-09 00:00:00' and d.posttime <='2023-10-09 00:00:00'  
  group by t.district,t.RegionName,t.name order by avg(count) desc

执行计划如下
在这里插入图片描述
可以看到第一行road_day表虽然全表查询但是没有嵌套循环了,虽然我不知道为什么没有了,但是实现了查询时间从20s到4s的转换,也算是成功了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值