前言
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;
将会被优化为:

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

被折叠的 条评论
为什么被折叠?



