MySql左连接(left join)查询非常慢
问题描述:
两张表:tb_buyer_account、b_ip。
tb_buyer_account表中ip_id字段对应tb_ip表中主键id字段,两张表数据都是3000多条;
查询语句:
(1)SELECT a.account,b.ip FROM tb_buyer_account a LEFT JOIN tb_ip b ON a.ip_id = b.id;
(2)SELECT a.ip,b.account FROM tb_ip a LEFT JOIN tb_buyer_account b ON a.id = b.ip_id;
查询语句(1)用时0.01s,而语句(2)用时164.90s。查询时间为什么相差如此之大。
解决问题:
按理说3000条数据不需要建立索引增加查询速率,查询语句(1)也加以证明了,但为什么语句(2)查询耗时如此大;
我对比了两个查询状态,有个Handler_read_rnd_next参数,查询语句(1)的值是3000多,语句(2)竟然有1000W多,这个参数的说明是:Number of requests to read the next row in the data file. This value is high if you are doing a lot of table scans.(读取数据文件中下一行的请求数。如果要执行大量的表扫描,则此值很高。)。
原因:
原因找到了Handler_read_rnd_next这个参数值非常大,而这个值非常大的原因是多次全表扫描,left join是依据左表匹配右表数据,而右表连接字段没有建立索引导致每匹配左表一条数据就要全表扫描右表数据,因此Handler_read_rnd_next值非常大,耗时长,语句(2)查询非常慢。
解决:右表tb_ip添加index索引,查询时间0.01s
如果添加索引查询时间还是很长,要确保索引是否有效,索引失效的话查询还是很慢。
总结:
左连接(left join)查询,右表连接字段需要加索引增加查询速率;
右连接(right join)查询,左表连接字段需要加索引增加查询速率;