遇到的问题
执行下面的语句:
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其他
如果有问题,可以一起讨论