MySQL--视图优化(三)

本文介绍 MySQL 5.7.5 版本中对视图和 FROM 子句中的派生表进行的重构优化,包括统一处理方式、提高处理效率以及优化策略。详细解析了合并优化和物化优化的过程。

续:

MySQL--视图优化(一)

MySQL--视图优化(二)


 

2 V5.7.5 视图和FROM子句中的派生表的重构

 

相关工作参见:http://dev.mysql.com/worklog/task/?id=5275

 

2.1.1 V5.7.5 视图和FROM子句中的派生表的重构内容

最近几年,MySQL的优化器进步很快,MySQL的Optimizer团队对于优化器作了许多的优化工作。

MySQL在5.7.5版本中,对于视图和FROM子句中的DERIVED table进行了一次重构工作,工作的结果:

1)从概念、编码实现的角度,统一了二者的处理方式,使得相似的内容处理(视图和派生表的处理方式)逻辑保持了一致,同一套代码清晰便于理解

2)提高了FROM子句中派生表的处理效率(对于可以merge的视图和派生表采用merge优化)

3)对于不可merge的视图和派生表采用“物化”的方式进行优化,达到只执行一次多次使用的优化目的

 

例如:

mysql> EXPLAIN SELECT * FROM t1, (SELECT * FROM t2) as tt;

+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+--------------------------------------+

| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                |

+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+--------------------------------------+

|  1 | SIMPLE      | t1    | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    3 |   100.00 | NULL                                 |

|  1 | SIMPLE      | t2    | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    4 |   100.00 | Using join buffer (Block Nested Loop)|

+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+--------------------------------------+

2 rows in set, 1 warning (0.00 sec)

 

从这个例子中可以看到,5.7.5版本中对于派生表采用了merge优化,消除了5.5中的子查询。这样查询效率得到较大提高。

 

从编码首先看,5.5代码mysql_make_view()中合并(merge)优化的代码被取出,这样就消除了单独优化视图的可能。

在sql_resolve.cc文件中通过调用SELECT_LEX::resolve_derived()统一对视图和派生表进行了如下操作:

 

for (TABLE_LIST *tl= get_table_list(); tl; tl= tl->next_local)

  对每个tl且是“视图或派生表”执行TABLE_LIST::resolve_derived();

for (TABLE_LIST *tl= get_table_list(); tl; tl= tl->next_local)

  对每个可merge的tl且是“视图或派生表”执行“合并”操作;

for (TABLE_LIST *tl= get_table_list(); tl; tl= tl->next_local)

  对每个不可merge的tl且是“视图或派生表”执行“物化”操作;

其中,tl可以是视图或派生表,这样的对象,要么被采用“合并”的方式优化,要么被采用“物化”的方式优化。

 

如下是一个物化的例子(派生表中多了一个LIMIT子句)。

mysql> EXPLAIN SELECT * FROM t1, (SELECT * FROM t2 LIMIT 1) as tt;

+----+-------------+------------+------------+--------+---------------+------+---------+------+------+----------+-------+

| id | select_type | table      | partitions | type   | possible_keys | key  | key_len | ref  | rows | filtered | Extra |

+----+-------------+------------+------------+--------+---------------+------+---------+------+------+----------+-------+

|  1 | PRIMARY     | <derived2> | NULL       | system | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |

|  1 | PRIMARY     | t1         | NULL       | ALL    | NULL          | NULL | NULL    | NULL |    3 |   100.00 | NULL  |

|  2 | DERIVED     | t2         | NULL       | ALL    | NULL          | NULL | NULL    | NULL |    4 |   100.00 | NULL  |

+----+-------------+------------+------------+--------+---------------+------+---------+------+------+----------+-------+

3 rows in set, 1 warning (0.00 sec)

 

其实,MySQL优化器的进化一直在进行着,有些进步尽管不如5.7.5对派生表和视图的优化进步大,但每一个版本,总是在向前迈进。如5.6.3,物化操作只发生在执行阶段,如果是EXPLAIN获得执行计划,则物化操作不发生。

Materialization of subqueries in the FROM clause is postponed until their contents are needed during query execution, which improves performance。

 

2.1.2 V5.7.5 视图和FROM子句中的派生表的重构的限制

不是所有的视图和派生表都可以被merge,不可merge的情况,类似1.4节,即简单视图或派生表,可以被merge,复杂视图和带有GROUP/HAVING/DISTINCT/LIMIT/聚集函数等子句的派生表只能被物化。

 

课程大纲: 第1课 数据库与关系代数 综述数据库、关系代数、查询优化技术 综述数据库调优技术 预计时间1小时 第2课 数据库查询优化技术总揽 综述查询优化技术范围,包括查询重用、查询重写规则、查询算法优化、并行查询优化等 综述逻辑查询优化,包括子查询的优化视图重写、等价谓词重写、条件化简、连接消除、非SPJ的优化等 综述逻辑物理优化,包括单表扫描算法、两表连接算法、多表连接算法、基于代价的算法等 初步理解MySQL的查询执行计划。 预计时间1小时 第3课 查询优化技术理论与MySQL实践(一)------子查询的优化(一) 第4课 查询优化技术理论与MySQL实践(二)------子查询的优化(二) 从理论看,子查询包括的内容和范围,建立清晰的概念 从实践看,MySQL的子查询优化技术的内容和范围,明确掌握子查询优化手段 预计时间2小时,每小时一个课程段(子查询是SQL查询优化的重点内容,务必掌握好) 第5课 查询优化技术理论与MySQL实践(------视图重写与等价谓词重写 什么是视图重写?哪些类型的视图可以被优化MySQL是怎么优化视图的?从而明白在MySQL中怎么写与视图相关的查询语句才能有好的效果? 什么是等价谓词重写?MySQL中怎么写WHERE子句有利于提高查询效率? 预计时间1小时 第6课 查询优化技术理论与MySQL实践(四)------条件化简 什么是条件化简?MySQL中对什么样的条件自动进行优化?如何写出可利用索引的条件语句? 预计时间1小时 第7课 查询优化技术理论与MySQL实践(五)------外连接消除、嵌套连接消除与连接消除 连接方式有些什么类型?不同类型的连接又是怎么优化的?外连接优化的条件是什么?MySQL中怎么写出可优化的连接语句?MySQL是否支持嵌套连接消除?MySQL是否支持连接消除?MySQL中书写SQL连接查询语句时的优化技巧。 预计时间1小时 第8课 查询优化技术理论与MySQL实践(六)------数据库的约束规则与语义优化 数据库的参照完整性(CHECKt NULL等)。什么是语义优化MySQL是否支持语义优化?怎么利用语义优化的思路人工进行SQL语句的优化? 预计时间1小时 第9课 查询优化技术理论与MySQL实践(七)------非SPJ的优化 什么是非SPJ优化? 从理论看,GROUP BY、ORDER BY、LIMIT、DISTINCT等怎么被优化MySQL中:GROUP BY是怎么优化的?ORDER BY是怎么被优化?LIMIT是怎么被优化?DISTINCT是怎么被优化? 非SPJ优化与索引的关系。 预计时间1小时 第10课 MySQL物理查询优化技术概述 从理论看,物理查询优化技术的范围。 从MySQL实践看,怎么利用物理查询优化技术对SQL查询语句调优? 本节预计会承接第9课的部分内容。 预计时间1小时 第11课 MySQL索引的利用、优化MySQL索引的角度出发,看各种SQL查询语句的优化怎么进行?(以前都是从语句的角度看怎么优化,现在站在索引的角度去总结SQL查询语句的优化) 预计时间1小时 第12课 表扫描与连接算法与MySQL多表连接优化实践 MySQL的单表扫描算法。MySQL的两表连接算法。MySQL的多表连接算法。 MySQL的多表连接的优化技巧。 预计时间1小时 第13课 查询优化的综合实例(一)------TPCH实践(一) 第14课 查询优化的综合实例(一)------TPCH实践(二) 以TPC-H国际标准的22条查询语句为实例,综合前面课程的内容,把所学的知识用于实践,进行综合的实战演练。 预计时间2小时(每个课时为1个小时) 第15课 关系代数对于数据库的查询优化的指导意义------查询优化技术总结 再次回到理论,从理论的高度总结关系代数理论与MySQL查询优化实践的关系。真正认识、掌握MySQL的查询优化技术,大步流星步入查询优化的高手之列。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值