关于left join 底层算法的困惑

发布于 2022-09-07 20:49:01 字数 854 浏览 22 评论 0

有个SQL的问题咨询下:
关于PostgreSQL 或者 MySQL的left join 实现

假设:表结构

table_name :user
uid    name
1      张三
2      李四
3      王五

table_name : age
uid    age
1      10
2      20
3      30
4      40
SQL如下:

示例1:
SELECT t1.user,t2.age
FROM user t1
LEFT JOIN age t2 ON t1.uid=t2.uid

示例2:
SELECT t1.user
       ,(SELECT age FROM age WHERE uid=t1.uid) as age
FROM user t1

结果:示例2的查询时间优于示例1,为什么........unbelievable

怀疑点:

示例1的SQL执行顺序是否是:
    第一种:
    1. 查询user全表
    2. 查询age全表
    3. 算法引擎将两种数据进行逐个匹配,获取结果

    第二种:
    1. 查询user全表
    2. 根据user查询出的数据为查询条件,查询age表
    3. 算法引擎将两种数据进行逐个匹配,获取结果

是哪一种??

望解惑~

补充:

    上面表是假设的,实际表有些复杂,但是逻辑是这个样子….
    
    总结一下问题:
    
    SQL中可能基础数据(主表数据)就10条,但是关联表中的数据可能百万条(与这10条相关的就几十万条),
    是查询百万条数据匹配,还是查询几十万条匹配

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

匿名的好友 2022-09-14 20:49:01

left join 的执行过程:
1.FROM:对左右两张表执行笛卡尔积,产生第一张表vt1(临时表)。行数为n*m(n为左表的行数,m为右表的行数
2.ON:根据ON的条件逐行筛选vt1,将结果插入vt2中
3.JOIN:添加外部行,如果指定了LEFT JOIN,则先遍历一遍左表的每一行,其中不在vt2的行会被插入到vt2,该行的剩余字段将被填充为NULL,形成vt3;如果指定了RIGHT JOIN也是同理。但如果指定的是INNER JOIN,则不会添加外部行,上述插入过程被忽略,vt2=vt3(所以INNER JOIN的过滤条件放在ON或WHERE里 执行结果是没有区别的,下文会细说)
4.WHERE:对vt3进行条件过滤,满足条件的行被输出到vt4
5.SELECT:取出vt4的指定字段到vt5

从Left join 过程你会发现步骤要比2要复杂一些,可能会造成一些耗时

诗酒趁年少 2022-09-14 20:49:01

要看场景的好吧,数据量千条, hash join明细比全表扫描快
图片描述

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文