【问题标题】:How JOIN works internally in MySQL?JOIN 在 MySQL 内部是如何工作的?
【发布时间】:2020-02-17 12:16:18
【问题描述】:

这是我的测试脚本,没有主键作为ID,测试用例是连接具有相同键的多行,结果是多少行。

create table Test1(id integer, name varchar(100));
insert into Test1(id, name) values(1, "Vijay");
insert into Test1(id, name) values(1, "Sandy");
insert into Test1(id, name) values(1, "Rohit");

create table Test2(id integer, surname varchar(100));
insert into Test2(id, surname) values(1, "karma");
insert into Test2(id, surname) values(1, "sharma");
insert into Test2(id, surname) values(1, "yadav");

select Test1.id , Test1.name , Test2.surname from Test1 
left outer join
Test2 on Test1.id = Test2.id;


1   Vijay   karma
1   Sandy   karma
1   Rohit   karma
1   Vijay   sharma
1   Sandy   sharma
1   Rohit   sharma
1   Vijay   yadav
1   Sandy   yadav
1   Rohit   yadav

select Test1.id , Test1.name , Test2.surname from Test1 
right outer join
Test2 on Test1.id = Test2.id;

1   Vijay   karma
1   Vijay   sharma
1   Vijay   yadav
1   Sandy   karma
1   Sandy   sharma
1   Sandy   yadav
1   Rohit   karma
1   Rohit   sharma
1   Rohit   yadav

这在内部如何运作?要做的是保持一个表静态并在其上流式传输另一个表,以及指针在这种情况下的工作原理以及连接过程中元数据的存储位置。

【问题讨论】:

  • 在关系数据库方面,如果你没有 PRIMARY KEY,那么你就没有真正的表

标签: mysql left-join right-join


【解决方案1】:

这在内部如何运作?要做的是保持一个表静态并在其上流式传输另一个表,以及指针在这种情况下的工作原理以及连接过程中元数据的存储位置。

关系数据库引擎对数据执行操作以访问、更新或删除它。每个引擎都有一个更小或更广泛的操作库。

例如,在您的情况下,MySQL 引擎可能会如下所示工作:

  • 由于没有过滤谓词(又名WHERE 子句),它可能会对一个表执行“全表扫描”,在执行计划中显示为“all”。
  • 然后,它可以使用“索引范围扫描”访问相关表,用 MySQL 的术语称为“index”。

这些操作是如何决定的?这就是 SQL 规划器和 SQL 优化器的工作。他们读取您的 SQL 查询并生成一个操作树,这些操作将被执行以产生您想要的结果。这棵树可能会根据 MySQL 的启发式和数据的变化而及时变化。

您如何获得具体计划?只需使用以下方式获取计划:

explain <query>

您将看到查询计划的全部荣耀。

【讨论】:

    猜你喜欢
    • 2011-12-26
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多