Join 算法与调优 中详细描述了 MySQL 5.7 版本能够支持的 Join 算法。

    网上有人说调大全局的 join_buffer_size 属性,目前来看不太建议,可以对部分复杂的 SQL,在执行前适当调大该值。

    多表关联查询的优化建议是对内表增加索引,尽量让优化器选择 Index Nested-Loop Join 算法,至于 MySQL 优化器会不会选择 Batched Key Access Join 算法,就要看 SQL 成本计算结果了,不过可惜 MySQL 5.7 默认是没有开启的。

    在 JOIN 连接时哪张表是驱动表,哪****表是被驱动表?

    • 当使用 LEFT JOIN 时,左表是驱动表,右表是被驱动表;
    • 当使用 RIGHT JOIN 时,右表时驱动表,左表是驱动表;
    • 当使用 JOIN 时,MySQL 会选择数据量比较小的表作为驱动表,大表作为被驱动表;


    如果没有办法确定,可以使用 EXPLAIN 分析当前 SQL 语句,在执行计划的第一行的表就是驱动表。

    image.png

    JOIN 查询如何选择驱动表与被驱动表?

    在 SQL 优化的时候选择小表驱动大表,减少连接次数。

    另外,驱动表如果在 WHERE 条件中没有使用到索引,则驱动表的访问类型(执行计划的 type)是 ALL。

    作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/mqb5mu 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。