带你学MySQL系列 | “数据分析师”面试最怕被问到的SQL优化问题(下)(一)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 带你学MySQL系列 | “数据分析师”面试最怕被问到的SQL优化问题(下)(一)

本文大纲

前面我已经带着大家学习了本文的第1-4个部分,今天就带大家学习这剩下的5-8个部分。MySQL优化问题对于新手学习,一般是个难题!我的教程自认为已经是很通俗易懂的。如果你学习了这个教程后,仍然不太理解,可以去B站找到一个视频浏览一遍,然后再回头看我的文章。

image.png


讲解使用的数据源

在上篇最后,我们已经给出了本文需要使用到的数据代码,这里我直接给出这3张表的图示。

image.png


5. explain执行计划常用关键字详解

1)id关键字的使用说明、

① 案例:查询课程编号为2 或 教师证编号为3 的老师信息;

# 查看执行计划
explain select t.*
from teacher t,course c,teacherCard tc
where t.tid = c.tid and t.tcid = tc.tcid
and (c.cid = 2 or tc.tcid = 3);


结果如下:

image.png

接着,在往teacher表中增加几条数据。


insert into teacher values(4,'ta',4);
insert into teacher values(5,'tb',5);
insert into teacher values(6,'tc',6);


再次查看执行计划。

# 查看执行计划
explain 
select 
  t.*
from 
  teacher t,course c,teacherCard tc
where 
  t.tid = c.tid and t.tcid = tc.tcid
  and (c.cid = 2 or tc.tcid = 3);


结果如下:

image.png

这里先记住一句话:表的执行顺序 ,因表数量改变而改变的原因:笛卡尔积。怎么回事呢?看看下面这个例子。


# 下面举一个例子
a   b   c
2   3   4
最终:2 * 3 * 4  = 6 * 4 = 24
c   b   a
4   3   2
最终:4 * 3 * 2 = 12 * 2 = 24


分析:最终执行的条数,虽然是一致的。但是中间过程,有一张临时表是6,一张临时表是12,很明显6 < 12,对于内存来说,数据量越小越好,因此优化器肯定会选择第一种执行顺序。


结论:id值相同,从上往下顺序执行。表的执行顺序因表数量的改变而改变,数量越小,越在前面执行。


② 案例:查询教授SQL课程的老师的描述(desc)

# 查看执行计划
explain 
select 
  tc.tcdesc 
from 
  teacherCard tc 
where tc.tcid = 
(
    select t.tcid from teacher t 
    where  t.tid =  
    (select c.tid from course c where c.cname = 'sql')
);


结果如下:

image.png

结论:id值不同,id值越大越优先查询。这是由于在进行嵌套子查询时,先查内层,再查外层。


③ 针对②做一个简单的修改

# 查看执行计划
explain 
select 
  t.tname ,tc.tcdesc 
from 
  teacher t,teacherCard tc 
where 
  t.tcid= tc.tcid
  and t.tid = (select c.tid from course c where cname = 'sql') ;


结果如下:

image.png

结论:id值有相同,又有不同。id值越大越优先;id值相同,从上往下顺序执行。


2)select_type关键字的使用说明:查询类型

select_type关键字共有如下常用的6种类型,下面我分别带着大家梳理一下,它们各自的含义。

image.png


① simple:简单查询

不包含子查询,不包含union查询。

explain select * from teacher;


结果如下:

image.png


② primary:包含子查询的主查询(最外层)

③ subquery:包含子查询的主查询(非最外层)

关于primary和subquery,我们就拿下面的这个例子进行演示。从代码中可以看到这个SQL语句是存在子查询的,换句话说,这个SQL语句包含子查询。where内层(非最外层)使用到的c表属于非最外层,因此是subquery关键字。where外层使用到了t表 和tc表,因此是primary关键字。


# 查看执行计划
explain 
select 
  t.tname ,tc.tcdesc 
from 
  teacher t,teacherCard tc 
where 
  t.tcid= tc.tcid
  and t.tid = (select c.tid from course c where cname = 'sql') ;


结果如下:

image.png

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
26 6
|
7天前
|
存储 Oracle 关系型数据库
【MySQL面试题pro版-12】
【MySQL面试题pro版-12】
14 0
|
7天前
|
SQL 关系型数据库 MySQL
【MySQL面试题pro版-10】
【MySQL面试题pro版-10】
13 1
|
7天前
|
缓存 关系型数据库 MySQL
【MySQL面试题pro版-9】
【MySQL面试题pro版-9】
20 1
|
7天前
|
存储 SQL 关系型数据库
【MySQL面试题pro版-8】
【MySQL面试题pro版-8】
12 0
|
7天前
|
存储 SQL 关系型数据库
【MySQL面试题pro版-7】
【MySQL面试题pro版-7】
18 0
|
7天前
|
存储 关系型数据库 MySQL
【MySQL面试题pro版-6】
【MySQL面试题pro版-6】
18 0
|
7天前
|
SQL 存储 关系型数据库
MySQL面试题系列-16
MySQL面试题系列-16
16 0
|
7天前
|
SQL 存储 关系型数据库
MySQL面试题系列-15
MySQL面试题系列-15
12 0
|
7天前
|
SQL 存储 关系型数据库
MySQL面试题系列-7
MySQL面试题系列-7
19 1