上一篇 <<<MySQL性能优化之分页查询优化
下一篇 >>>MySQL性能优化之in、exists优化
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优化器自己判断的时间
推荐阅读:
<<<MySQL执行计划示例解读
<<<MySQL性能优化之慢查询定位
<<<MySQL性能优化之表设计优化
<<<MySQL性能优化之常用SQL语句优化
<<<MySQL性能优化之索引调优实战
<<<MySQL性能优化之分页查询优化
<<<MySQL性能优化之in、exists优化
<<<order by中的单路和双路排序算法原理
<<<MySQL如何性能优化面试题完美解答