Mysql深度讲解 – 派生表

本文介绍了Mysql中的派生表概念,包括其定义、物化策略及优化方法。此外,还探讨了派生表与临时表、物化表的区别,并提供了具体的优化案例。

前言

Mysql在查询语句中一般会使用自建表,这种自建表有临时表,派生表以及在之前的子查询优化【子查询优化】的博客里面介绍的物化表。本篇就对遗漏的派生表做一个介绍,作为Mysql知识的补充。更多Mysql调优内容请点击【Mysql优化-深度讲解系列目录】

派生表

派生表是一般是一个查询中的子查询结果集,它和临时表的区别在于:用户无法看到临时表,仅仅能够通过explain关键字查找到一个sql的某些步骤使用了临时表。而派生表则是有名字的临时表,这个名字就是用户在sql中赋予的,比如:

select * from (select a, b from t1) as t;

上面这个sql,子查询是放在from后面的,这个子查询的结果相当于一个派生表,表的名称是t,有a,b两个字段。

派生表物化

我们首先回忆一下什么叫物化:在mysql中,不直接将不相关子查询的结果集当作外层查询的参数,而是将该结果集写入一个临时表里,这个将子查询结果集中的记录保存到临时表的过程称之为物化Materialize。那么将派生表的结果集写到一个内部的临时表中,然后就把这个物化表当作普通表一样参与查询的过程,就叫做派生表物化。

派生表的物化策略

在对派生表进行物化时,使用了一种称为延迟物化的策略。也就是在查询中真正使用到派生表时才会去尝试物化派生表,而不是还没开始执行查询就把派生表物化掉。比如:

select * from (select * from t1 where a = 10) as derived1 inner join t2 on derived1.a = t2.a where t2.a =10;

如果采用物化派生表的方式来执行这个查询的话,那么执行时首先会到t1表中找出满足t1.a = 10的记录。如果找不到,说明参与连接的t1表记录就是空的,所以整个查询的结果集就是空的,所以也就没有必要去物化查询中的派生表了。

派生表的优化(消除)

出现派生表并不是一个好的查询方案,因为派生表本质上也是临时表,如果过大也许不得不在磁盘上创建,这样的创建和访问都是需要消耗IO资源的。因此如果能够通过优化把派生表消除也就变成了一种优化手段。有些时候Mysql的查询优化器会自动优化sql,并且把派生表合并到外层查询中,比如:

select * from (select * from t1 where a = 1) as t;

将会被优化为:


                
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值