300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > mysql优化之in内子查询

mysql优化之in内子查询

时间:2022-04-17 03:33:09

相关推荐

mysql优化之in内子查询

遇到的问题

执行下面的语句:

select f.id,f.name from father f where id in(select max(id) from father group by name);

前提 id为primary键name为单列索引 情况 先执行子查询,走索引再执行外查询,但是外部查询没有走索引,进行了全表扫描

解决方法有

group_concat()构造逗号分隔字符串,但是有1024字节限制exists 如果左边为大表,还是会全文搜大表join

具体分析

因为1,2 都有限制,且in中子查询对不同mysql版本不同的策略,所以换一种思路,做等价操作,将不确定转为确定情况in 相当于inner join

使用in大部分情况,子查询结果集比较小,而由小表驱动大表,将子查询结果放前边

最后改写为:

select f.id,f.name from (select max(id) id from father group by name) s join father f on s.id=f.id;

优点

子查询结果集大一点也能执行inner join 会使用大表的索引子查询结果集较小,小表驱动大表执行顺序固定,先子查询后inner join

其他

如果有问题,可以一起讨论

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。