记录一次SQL优化

先说下背景:
广告表ad 城市表city_area_code 按城市显示广告关系表 ad_r_area_Code(索引是ad_id 、area_code)
管理平台有个页面显示列表,如图:
在这里插入图片描述
之前用的一个大的SQL去写

SELECT a.id, a.title, GROUP_CONCAT(c.`name` SEPARATOR '、') AS area_code_name
FROM ad   a
  LEFT JOIN ad_r_area_Code b ON a.id = b.target_id AND b.target_type = 2
  LEFT JOIN city_area_code c ON b.area_code = c.id
GROUP BY a.id
ORDER BY a.create_time DESC limit 20

增加“GROUP BY a.id”和“GROUP_CONCAT(c.name SEPARATOR ‘、’) ”是要实现第二个红框的内容显示。
ad表有25万条数据,有索引的情况下执行了25秒多。通过在SQL前加 EXPLAIN

EXPLAIN SELECT a.id, a.title, GROUP_CONCAT(c.`name` SEPARATOR '、') AS area_code_name
FROM ad   a
  LEFT JOIN ad_r_area_Code b ON a.id = b.target_id AND b.target_type = 2
  LEFT JOIN city_area_code c ON b.area_code = c.id
GROUP BY a.id
ORDER BY a.create_time DESC limit 20

结果:
在这里插入图片描述
每列的含义,如图:
在这里插入图片描述

Using temporary使用了临时表,官网指出使用group by 或者order by 会出现这个值
在这里插入图片描述
经尝试去掉“GROUP BY a.id”后果然没有了Using temporary值,执行时间190毫秒。
因为使用了 group by 导致的SQL执行时间过长。
那不用group by如何实现第一图的第二个红框的内容呢?
使用了 在列上加子查询

SELECT a.id, a.title, 
 (SELECT GROUP_CONCAT(c.`name` SEPARATOR '、') 
		FROM ad_r_area_Code bb 
			, city_area_code c  WHERE bb.area_code = c.id AND a.id = bb.target_id AND bb.target_type = 2 )
FROM ad a
ORDER BY a.create_time DESC limit 20

执行时间100毫秒,但是查看explain发现 ad没有使用索引
在这里插入图片描述
假如数据量继续增加,执行时间也会变长,哪还能不能继续优化呢?是不是可以让表ad走索引,执行时间还会变短呢?
是的,对ORDER BY的列增加索引即可,经测验大于1列的排序是不走索引的;这是因为btree索引是排好序的;hash索引不知道了。innodb建不了hash索引

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值