2018-01-31 DBA日记,MYSQL left join结果数不对

一、背景

今天在进行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

分析:在关联字段上增加索引,结果集正确

结论

  1. 在mysql 5.7.13版本中进行left join时,关联字段没有走索引,结果集错误,已经被标识为MYSQL的BUG。
  2. 为避免触发该BUG,关联字段一定要有索引,并应用上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值