背景
这几天同事写报表,sql语句如下
select *from`sail_marketing`.`mk_coupon_log`a left join `cp0`.`coupon`c on c.code_id =a.coupon_code;
查询出来的结果花了60多秒
数据背景
mk_coupon_log表数据 9368
coupon表数据37735
mk_coupon_log表的coupon_code字段有索引
分析过程
分析原始sql语句
explain
select * from `sail_marketing`.`mk_coupon_log` a left join `cp0`.`coupon` c on c.code_id = a.coupon_code;
type都是ALL,即全表查询,没有用到索引,其中Extra列出现 Using join buffer (Block Nested Loop),从字面意思理解用到了缓存跟循环
其中a表也没用到coupon_code列的索引
一般情况下,第一行称为驱动表,第二行称为被驱动表,从上图可知,a表示驱动表,c表示被驱动表
果断给coupon表的code_id字段加上索引
增加索引之后查询时间0.136秒,分析其sql语句
explain
select * from `sail_marketing`.`mk_coupon_log` a left join `cp0`.`coupon` c on c.code_id = a.coupon_code;