问题描述:
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以内。
总结:
在做表结构设计的时候,主键索引的字段类型一定要一样,名字可以不一样,但是字段类型一定要一样,不然非常影响查询效率。