一、背景
今天在进行mysql sql调优时,无意中发现在mysql 5.7.13 中进行left join查询出来的结果不对。
二、问题
为什么mysql 5.7.13 中进行left join查询出来的结果不对?
三、数据收集与分析
3.1 重现
t1: 记录数,6462 ; col1 非索引关键字
t2: records,2582 ; col1 非索引关键字
SQL:
select count(*) from T1 letf join T2 on t1.k1=t2.k1
返回:5561628
执行计划:
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE a ALL 6075 100
1 SIMPLE b index FK37FD9F27F5FA93E1 161 2378 100 Using where; Using index; Using join buffer (Block Nested Loop)
分析:成功重现,返回的记录数错误
3.2 案例收集
在互联网上进行案例收集在bug.mysql.com上发现记录"Wrong result with LEFT/RIGHT JOINs, subqueries, index",网址如下:
https://bugs.mysql.com/bug.php?id=80143&error=un 分析:根据buglist上所描述,确认这是mysql的一个bug,并且引发这个bug是由关联字段没有索引所致。
3.3 进一步验证
t1: 记录数,6462 ; col1 索引关键字
t2: records,2582 ; col1 索引关键字
SQL:
select count(*) from T1 letf join T2 on t1.k1=t2.k1
返回:6462
分析:在关联字段上增加索引,结果集正确
结论
- 在mysql 5.7.13版本中进行left join时,关联字段没有走索引,结果集错误,已经被标识为MYSQL的BUG。
- 为避免触发该BUG,关联字段一定要有索引,并应用上。