连接查询是mysql多表查询的核心,我主要从逻辑和执行两个层面连接它。
从逻辑层面来说,连接查询的核心是对多表之间的数据关联,主要分为内连接和外连接。内连接查询的是数据的交集。外连接包括左连接、右连接和全外连接,mysql不支持全外连接。左、右连接的逻辑是保留对应的表的全量数据,对于另一个表中没有匹配的记录用NULL填充。实际开发中通常都统一使用左连接代替右连接来保证代码可读性。
从执行层面来说,连接查询的关键在于驱动表的选择和索引的使用。内连接查询时mysql优化器会根据统计信息自动选择小表作为驱动表。外连接查询驱动表固定为主表(即左连接查询驱动表就是左表),所以为了发挥B+树的优势,避免被驱动表发生全表扫描,被驱动表一定要对关联字段加索引。
另外,使用外连接时要特别注意on和where字句的区别,ON 是在生成临时表时使用的条件(联表前筛选),而 WHERE 是在临时表生成之后对结果进行过滤的条件(联表后筛选)。如果对从表的过滤条件写在where中,会导致外连接退化成内连接。所以如果想保留主表的所有记录,那么针对从表的筛选条件必须写在 ON 里。如果想过滤最终的结果集(包括过滤掉没匹配上的主表记录),才把条件写在 WHERE 里。
第一条说说


