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

简介: 带你学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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
10月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1578 152
|
10月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
1095 156
|
10月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
10月前
|
SQL 监控 关系型数据库
查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
以上步骤提供了直观、实用且易于理解且执行的指导方针来监管和优化数据库服务器配置。务必记得,在做任何重要变更前备份相关配置文件,并确保理解每个参数对系统性能可能产生影响后再做出调节。
870 11
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
455 4
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
2657 2
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。

推荐镜像

更多