作者:苏仕祥
浩鲸科技 PaaS 组件团队成员,长期从事分库分表中间件的相关解决方案工作,热爱技术,乐于分享。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文主要讲解 DBLE 是如何实现 MySQL 视图功能的,内容包括 MySQL 视图相关概念、MySQL 对视图的实现,以及 DBLE 对视图的实现。
一、MySQL 视图概念及 MySQL 中视图的实现
MySQL 5.0 版本开始引入视图。视图本身是一个虚拟表,不存放任何数据。在使用 SQL 语句访问视图的时候,它返回的数据是 MySQL 从其他表中生成的。
MySQL 中对于视图是如何实现的呢?
MySQL 中通过两种算法来实现视图功能,分别称为合并算法(MERGE)和临时表算法(TEMPTABLE)。
如下图所示(图片出自《高性能 MySQL》):
![f0070cdf3219ddefbde9462215eaa977.png](https://i-blog.csdnimg.cn/blog_migrate/d8e6e08f1fa19aae9e8f2af47d454f7a.jpeg)
合并算法就是将视图 SQL 和查询 SQL 合并,然后执行查询,可以看到如果我们通过视图来简化 SQL,其实在 MySQL 底层又给我们转换了过来。
临时表算法就是在执行查询的时候,定义的视图会先生成对应的临时表,然后服务器基于该临时表执行相应的查询。
那么 MySQL 究竟会使用哪种算法呢?
如果在创建视图的时没有显示指定算法,MySQL 会尽可能的使用合并算法。如果视图中包含 GROUP BY、DISTINCT、任何聚合函数、UNION、子查询等,只要无法在原表记录和视图记录中建立一一映射的场景中,MySQL 都会使用临时表算法来实现视图(当然这些规则可能随着 MySQL 的版本更新发生变化)。想要确定 MySQL 究竟使用何种算法,可以 EXPLAIN 一条针对视图的简单查询,如果 select_type为"DERIVED",则为临时表算法。
二、DBEL 对视图的实现
DBLE 对视图的实现主要分为两种情况,一种是可下推,另一种为不可下推。
- 可下推:DBLE 直接将视图相关 SQL 下推到后端 MySQL 执行,DBLE 端只保存视图相应元数据信息。
- 不可下推:DBLE 会在逻辑层面实现视图,然后当执行视图相应查询 SQL 的时候,在将相应查询 SQL 与视图 SQL 合并后执行,这里就相当于 MySQL 中的合并算法了。
那么可下推或不可下推的情况是如何判断的呢?
通过判断相应的逻辑 schema 是不是 nosharding(nosharding 表示 schema 中没有表配置)。如果是 nosharding 则可下推,否则不可下推。其实这里可以看出来,可下推的情况可能比较少出现。
DBLE 对视图的实现详情如下图所示:
![db9bd2f0263de4abc267dde582abb06b.png](https://i-blog.csdnimg.cn/blog_migrate/50958ebed006a4c28cad47e98ab5b5b9.jpeg)
总结
本文主要讲解了 DBLE 是如何实现 MySQL 视图的,内容包括 MySQL 视图相关概念、MySQL 对视图的实现,以及 DBLE 对视图的实现,希望对大家理解 DBLE 的视图实现有所帮助。