mysql 查询不到记录取默认值_MySQL优化查询3:explain和show profiles | 数据分析学习历程全记录...

3dff30785d4adc831525a8cb69e8cff2.png

本文包括以下内容:

Explain的使用和理解

Show profiles的使用和理解

1. Explain的使用和理解:

无论是show processlist还是慢查询日志,两者都是需要开始执行后才能知道该查询请求是否效率低下,如果能够在提交请求之前就能知道该查询的效率,将省下很多时间和资源。

‘Explain’就是这样一种方法。

当然,对于show processlist和慢查询日志得到的SQL语句,也可以通过Explain方法来查看MySQL是如何执行该请求的。

比如输入:

EXPLAIN 

得到结果:

3d1936a998373d0eca2a3619dddd0522.png

接下来我们看一下每个字段的意思。

1.1 Id:

ID是表的一个代号。如果查询语句中涉及表连接,那么涉及的表的id都是1,但是表顺序是根据查询语句排序。

比如:

EXPLAIN

得到的结果为:

7eebfce50c63f046771bf903b7730e59.png

可以发现对于a,b两张表其id都为1,但是因为采用了left join,所以a排在b的前面。那么当我们将left join换成right join后:

EXPLAIN 

结果为:

a6f28eafabf77b5ee623b057b277a19f.png

发现table列中b表在a表前。

如果是子查询,则id不同,id越大,则查询越早。

比如:

EXPLAIN

结果为:

629154727c6e8e1e7e4d97ecbd977aa6.png

发现student表的id为1,score表的id为2,说明score首先被查询。

1.2 Select_type:

Select_type下具有几个不同的值:

1.2.1 Simple

指简单的select查询,不包含子查询或者Union。比如:

EXPLAIN 

1.2.2 Primary

查询中若包含任何复杂的子查询。

1.2.3 Subquery

在select或where列表中使用了子查询。比如:

EXPLAIN

629154727c6e8e1e7e4d97ecbd977aa6.png

此时student表为primary,score表为subquery,说明student表中包含了子查询,该子查询是score表。

1.2.4 Derived

在From列表中包含的子查询。

但是当我们输入:

EXPLAIN 

发现结果为:

8b0cde22a48f861cebcef4f45d8f2e29.png

其select_type仍然是simple,而且只有一个表。那么from子句后的衍生表a跑哪里去了?

这是因为在MySQL5.7之后,优化器多了一个derived_merge的优化选项,即子查询合并优化,对于上面的SQL,优化器会将子句合并到外查询,直接变成SELECT * FROM student。

根据官方的使用手册,我们可以在子查询中加入聚合函数、DISTINCT、GROUP BY、HAVING、LIMIT、UNION或UNION ALL等情况时将产生派生表。

或者可以通过下面的语句将该功能关闭:

SET 

再一次操作后得到的结果为:

11089a910b00bcf71e3a2ca8297310dd.png

此时表student的select_type显示为Derivied。同时可以发现table字段中id为1的表显示<derived2>,表示是从id为2的衍生表中进行查询。

1.2.5 Union

若第二个select出现在union之后,则标记为union

1.2.6 Union result

从Union表获取结果的select

输入:

EXPLAIN

输出结果为:

fa3b83cf76604eaeeca25565d44c8eb5.png

因为在SQL语句中表score出现在union之后,因此被标记为union。

但是在查找的资料中发现理应出现union result,可是这里没有。但是如果将上面的SQL语句中的Union ALL替换成Union后则出现了union result。

输出结果如下:

bb315c75ab61861072ea1c04165f18d8.png

这一点比较奇怪,目前也没有查询到相应的解答。

1.2.7 Select_type查询效率

查询效率由高至低依次为:Simple -> Primary -> Subquery -> Derived -> Union -> Union result。

1.3 Table

当前查询的数据来源于哪一张表。

1.4 Partition

使用了哪个分区。

所谓分区表就是为了缓解增删改过程中数据库的压力,将一张大表按照某种规则分区存储在不同的物理位置,理论上存储在不同分区的数据依然属于同一张表。而分表则是将一个大表分成几个小表,小表中的数据不再属于大表。

经验上经常按照时间将大表进行分区。

1.5 Type

访问类型,表示以何种类型访问了对应的表。接下来解释每种访问类型及其查询效率。

904b730b75998d22c47478c7e77b4090.png

Type查询效率:

查询效率由高至低依次为:Null -> System -> Const -> Eq_ref -> Ref -> Range -> Index -> All。

1.6 Possible_keys

可能用到的索引,也就是对应表中存在的所有索引。

1.7 Key

在查询过程中实际用到的索引。

1.8 Key_len

索引的长度,表示索引字段可能的最大长度。

1.9 Ref

表示在索引查询中被当作值使用的在其他表里的字段或者常数。

比如采用一个表连接查询,其中where子句使用了一个索引列(studentid)的常量作为过滤条件:

EXPLAIN 

输入结果为:

4018993df03e6b029db4c1ec7ceea15e.png

发现ref字段中对于表b而言为const,即常量,表示将表a的索引列的一个常量作为过滤条件。

此时如果把过滤条件改为:’WHERE a.studentid > 1’或者使用其它列作为过滤条件,我们会发现结果改变了:

c207647538adaab735e52cfbd47a53f7.png

1.10 Rows

扫描的行数。

1.11 Filtered

这个字段感觉在网上的解释都不太清楚,其官网解释是:

868d167a318b6839cb7ad29ddab7316b.png

翻译过来的意思是:filtered字段表示过滤后返回行数与过滤前存储的表的总行数的比值的预测值。

做了几个简单的测试,发现filtered字段的值与where子句的关系比较紧密。但该预测值往往与实际情况相差甚远,因此感觉filtered的参考价值并不大。

# 

1.12 Extra

其他额外的执行计划信息,额外的信息种类非常多,此处展示几个最常出现的额外信息:

18d5b71f1b7832512ad80e6cfadf8ddc.png

2. Show profile

该语句可以查询了解SQL在执行过程中将时间耗费在哪个阶段。

# 

比如依次运行:

SELECT 

得到输出结果:

fd83732293e88d6f0fe9ab0ed16f03e0.png

可以看到Query_ID为118的即我们刚才的请求。

接着我们输入:

SHOW 

可以查询单个查询请求的时间用在了哪里(sending data是指线程开始访问数据行到结果查询出来并返回客户端的整个过程)。

结果为:

0e08fdbf83045e5fb1eb6aea7938f275.png

因为我们的请求是select sleep(5),所以可以看到这里user_sleep对应的持续时间为5秒。

那么如果我们采用:

SELECT 

结果为:

cf1b16d823d4f499496cd7f05fbe747b.png

发现多出来statistics和preparing,以及较长时间的过程变为executing。

如果输入请求:

SELECT 

结果为:

f5672c6a7ce7c83777f22c0b2f37d97c.png

此时又多出来创建临时表和删除临时表两个步骤。

可以看到show profile只显示运行过的步骤,如果不涉及该步骤则不显示。

通过以下请求可以查看更详细的信息。

# 

欢迎关注专栏:

数据分析学习历程全记录​zhuanlan.zhihu.com
979e02b73cabbaf722d8603bdb2f3529.png

其他关于SQL的文章:

舟晓南:MySQL优化查询1:索引及其使用技巧 | 数据分析学习历程全记录

舟晓南:MySQL优化查询2:如何查找低效率语句 | 数据分析学习历程全记录

舟晓南:MySQL的执行逻辑和表的结构 | 数据分析学习历程全记录

舟晓南:转行数据分析师如何开始学习SQL | 工科生三个月转行数据分析学习心得

其它关于数据分析的文章:

舟晓南:如何转行和学习数据分析 | 工科生三个月成功转行数据分析心得浅谈

舟晓南:求职数据分析师岗位,简历应该如何写?|工科生三个月成功转行数据分析心得浅谈

需要SQL学习资料可私信~

数据分析学习社群正式启动~

在这里会分享各种数据分析相关资源,技能学习技巧和经验等等~

详情私信,一起进步吧!

写于成都

2020-8-27

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值