Join 语句执行过程性能差,原因可能是什么?哪里需要建立索引?

2022-02-23 14:29:59 浏览数 (1)

小伙伴蚂蚁金服二面遇到的三道题:

  1. SQL 查询语句:SELECT * FROM A JOIN B ON A.id = B.id,执行过程性能差,原因可能是什么?
  2. 上述 SQL 语句的执行过程是什么?哪里需要建立索引?
  3. 在 A.id 还是 B.id 上建立索引呢?

可能你会一脸懵逼,But 实际上,其实考的就是 join 这个知识点,不难,看完这篇文章你就会啦~

老规矩,背诵版在文末。

join 基本语法

MySQL 中常见的有三种用法:

代码语言:javascript复制
select * from table1 inner join table2 on condition
select * from table1 left join table2 on condition
select * from table1 right join table2 on condition
  • inner join:内连接(等值连接)
  • left join:左连接
  • right join:右连接

下面用例子来解释这三种用法,假设有两张表,用户表 user 和部门表 depart:

inner join

代码语言:javascript复制
select user.name, user.age, depart.department 
from user inner join depart 
on user.name = depart.name; 

inner join 获取同时符合两张表的数据并组合起来。

在这个例子中,就是在 user 表和 depart 表中找到 name 相同的行记录,并组合起来

来看实际的执行结果:

需要注意的是,如果不指定 on 条件进行过滤的话,取得的结果就是两张表的笛卡尔积

什么是笛卡尔积 ? 举个例子,两个集合 A{1, 2, 3} 和 B{a, b, c},则两个集合的笛卡尔积为 {1a, 1b, 1c, 2a, 2b, 2c, 3a, 3b, 3c}

代码语言:javascript复制
select user.name, user.age, depart.department 
from user inner join depart;

光看这个例子大伙儿可能觉得笛卡尔积没啥用,其实还是很常见的,举个例子:如果 A 表示某学校学生的集合,B 表示该学校所有课程的集合,则 A 与 B 的笛卡尔积就表示这个学校所有可能的选课情况(梦回大一被数据库支配的恐惧

0 人点赞