MySQL性能优化之关联查询优化
2022-09-15 本文已影响0人
曹老师
1.left join原理
按照语句的写法,以left join的左边为主表去关联右边的表,如果左边是大表,则会导致执行的行数较多,性能较差。
EXPLAIN select * from jarye_1 left join jarye_2 on jarye_1.t1= jarye_2.t1;
2.inner join原理
无论哪个表写在前面,优化器会选择使用数据量小的表作为驱动表,去关联大的表,以减少全包扫描的范围。
所以使用 inner join 时,排在前面的表并不一定就是驱动表。
2.1Nested-Loop Join(NLJ) 嵌套循环连接算法(主键关联查询)
EXPLAIN select * from mayikt_1 inner join mayikt_2 on mayikt_1.t1= mayikt_2.t1;

2.2Block Nested-Loop Join (BNL) 基于块的嵌套循环连接算法(非索引关联查询)
EXPLAIN select * from mayikt_2 straight_join mayikt_1 on mayikt_1.t2= mayikt_2.t2;


3.关联查询优化总结
1.超过三个表禁止 join。【阿里巴巴JAVA开发手册】
2.需要 join 的字段,数据类型必须绝对一致;【阿里巴巴JAVA开发手册】
3.多表关联查询时,保证被关联的字段需要有索引,尽量选择NLJ算法。【阿里巴巴JAVA开发手册】
4.小表驱动大表,写多表连接sql时如果明确知道哪张表是小表可以用straight_join写法固定连接驱动方式,省去mysql优化器自己判断的时间