在公司开发中常常会遇到关联表查询,当查询的数据表数据量变大时,需要我们来优化查询语句。
首先贴一个待优化的sql语句
select * from A left join B on A.c= B.c where A.employee_id = 3
类似于上图的查询语句很常见,在c字段不加任何索引的情况下,当A、B数据表中数据达到1w的情况下,用explain分析可得,使用全表查询,效率低下。
优化方案
1.给A、B表都加索引c
执行结果可以发现B表的索引起到了作用,B表没用进行全表查询,那为啥A表的索引不起作用呢?
因为Mysql内部的优化,使用小表驱动大表,它在估算到必须有一个表要全表扫描的话,一定会选择那个数据量更小的表去全表扫描,也就是说,在这个查询中,因为on以后的where条件列并没有使用到索引,所以mysql的优化只用到了表B的c索引,没有用到表A的索引!
2.给A、B表加上索引c,给A表再加一个employee_id的索引
执行结果可以发现A表的索引起到了作用,但是employee_id索引再c之前执行,这是为啥?
这一句Sql在执行的时候首先是选择了使用表B的索引来进行优化,将表A单独放出来进行后续的操作,然后,又发现了where语句中A.employee_id有一个聚合索引,并且employee_id处于索引头,所以这个聚合索引是可用的,so自然使用了此索引
3.给B加上索引c,给A表加上employee_id的索引
执行结果发现是没有问题的,所以综上所得这个方案是最优解
记录工作中细小点滴–xiang.xin