left join on 和 where

测试 是on 先执行还是 where 先执行 ?
表 t1 id 是主键

mysql> select * from t1;
+----+-------+------+
| id | desc  | t2Id |
+----+-------+------+
|  1 | hello |    1 |
|  2 | frank |    2 |
|  3 | lucy  |    3 |
|  4 | mini  |    4 |
|  5 | cat   |    5 |
+----+-------+------+

表 t2 id 是主键

mysql> select * from t2
;
+----+------+
| id | desc |
+----+------+
|  1 | test |
|  2 | how  |
|  3 | are  |
|  4 | you  |
|  5 | what |
|  6 | is   |
|  7 | the  |
+----+------+

通过 left join

mysql> EXPLAIN
SELECT * from t1
LEFT JOIN t2 on t1.t2Id = t2.id;
+----+-------------+-------+------------+--------+---------------+---------+---------+---------------+------+----------+-------+
| id | select_type | table | partitions | type   | possible_keys | key     | key_len | ref           | rows | filtered | Extra |
+----+-------------+-------+------------+--------+---------------+---------+---------+---------------+------+----------+-------+
|  1 | SIMPLE      | t1    | NULL       | ALL    | NULL          | NULL    | NULL    | NULL          |    5 |      100 | NULL  |
|  1 | SIMPLE      | t2    | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | river.t1.t2Id |    1 |      100 | NULL  |
+----+-------------+-------+------------+--------+---------------+---------+---------+---------------+------+----------+-------+

如果加上 where 语句呢,查找 t1.id = 1 的数据,看看 先是进行了 join on 操作生成 临时表后,再进行where 筛选吗?(网上给的思路都是这样)

mysql> EXPLAIN SELECT * from t1 LEFT JOIN t2 on t1.t2Id = t2.id where t1.id = 1;
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | t1    | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |      100 | NULL  |
|  1 | SIMPLE      | t2    | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |      100 | NULL  |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+

可以看到分析的结果 t1 表的 rows是 1 ,看来只用到了一行,说明是先进行了 where 筛选 再进行了 join 操作,这样也符合优化的逻辑。不然临时数据会有大量的无用数据。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,886评论 5 116
  • 1. 了解SQL 1.1 数据库基础 ​ 学习到目前这个阶段,我们就需要以某种方式与数据库打交道。在深入学习MyS...
    锋享前端阅读 1,178评论 0 1
  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 9,881评论 0 44
  • SQL左右连接中的on and和on where的区别 原先一直对SQL左右连接中的on and和on where...
    jianghu000阅读 2,634评论 0 2
  • 开车的时候,不管怎么走路,总会有两大方向:一是开向目标,获得社会认可;二是开向加油站,支付给自己,给自己加油。生活...
    季中阅读 808评论 0 0