导读
在 mysql 5.7环境, 两个 10W行数据左右的表, 做left join 耗费 半小时.
sql参考如下 (特殊说明: 如下出现的sql和表均为测试模拟的)
select count(1) from db1.sbtest1 t1 left join db1.sbtest2 t2 on t1.c=t2.c and t1.pad=t2.pad;
排查过程
首先看执行计划, 发现rows基本上和表大小一致 (实际环境, type:index 也是全扫, 不要被误导了. (联合索引)).
查看更详细的执行计划 (format=json) 发现存在字符集转化问题.
查看表结构, 发现两个表字符集不一样. 故要求其整改. 但字符集转化影响应该不大. 还是得看看为啥是全表扫描.
查看表DDL, 发现ON字段没得索引…
如果是8.0的话, 没得索引还可以使用hash join, 速度也是非常快的. 但是5.7 没得索引就贼慢. 加上索引之后速度就快了(不到0.5秒)
alter table db1.sbtest2 add index t2_c(c);
本案例还是比较简单的.
分享这个案例的另一个原因是: 沟通的时候, 开发说有没得索引区别真没那么大.
mysql查询数据索引的影响是很大的, 基本上90%的优化都能通过加减索引来实现.
参考: https://dev.mysql.com/doc/refman/8.0/en/hash-joins.html