Mysql-left join 遇到的问题记录

问题描述:

A表主键为key,A表记录2w条。

B表主键为key,B表记录1w条。

要求A表和B进行左外链接,查询A表所有记录,在B表没有对应记录的列设为null。

很明显使用A left join B就能满足需求

但是,问题是:

select * from A a left join B b on a.key = b.key;

在使用正常的查询的时候发现查询效率很低,需要大约70秒左右。

使用:

explain select * from A a left join B b on a.key = b.key;

显示执行计划发现并查询并没有走索引,查询量差不多就是2w*1w的笛卡尔积了。但是明明是使用key作为主键进行查询了啊,为什么不行呢?

查询了很多资料,也搜了很多优化条件,大多数说的都是尽量让条件使用索引,体检减小驱动表得到大小等方法,但是貌似都不管用。

后来仔细查看了下A表和B表的表结构,发现A表的索引key是int类型,但是B表的索引key是varchar类型!!!!!

这才是导致问题慢的主要原因,通过转换类型重新查询,发现查询时间从70s+降到1s以内。

总结:

在做表结构设计的时候,主键索引的字段类型一定要一样,名字可以不一样,但是字段类型一定要一样,不然非常影响查询效率。

猜你喜欢

转载自blog.csdn.net/liangcha007/article/details/83895048