- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MySQL 视图(View)原理解析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
mysql 5.0以后引入了视图。视图实际是一个自身不存储数据的虚拟数据表。实际这个虚拟表的数据来自于访问视图的 sql 查询的结果。mysql 处理视图和处理数据表差不多,通过这种方式来满足很多需求。视图和数据表在 mysql 中共享命名空间,然而 ,mysql 处理而二者的方式并不相同,例如,视图没有触发器,并且无法使用 drop table 移除视图.
下面以 world 样例数据库为例来展示视图的工作机制.
1
2
3
|
create
view
oceania
as
select
*
from
country
where
continent =
'oceania'
with
check
option
;
|
实现视图最简单的方式是执行select查询语句并将结果放入到一张临时表中。之后,就可以在视图出现的地方引用这张临时表。例如下面的查询语句:
1
|
select
code,
name
from
oceania
where
name
=
'australia'
;
|
下面是服务端执行上面语句可能的形式(临时表名称是随意取的,实际内部不知道是什么):
1
2
3
|
create
temporary
table
tmp_oceania_123
as
select
*
from
country
where
continent =
'oceania'
;
select
code,
name
from
tmp_oceania_123
where
name
=
'australia'
;
|
这种形式显然存在性能问题,最好的方式是将视图和查询的分布查询改为一句 sql 语句,如下所示:
1
2
|
select
code,
name
from
country
where
continent =
'oceania'
and
name
=
'australia'
;
|
在 mysql 中会使用两种算法,称之为 merge 和 temtable,而且会尽可能地使用 merge 算法。甚至,mysql 能够将嵌套视图进行合并。下图是两种算法的区别:
当视图中有 group by,distinct,聚集函数,union,子查询或其他数据表之间不是一对一的关系时,mysql 会使用 temptable算法。如果想知道视图是使用 merge 还是 temptable,可以使用 explain 指令检查:
1
|
explain
select
*
from
<视图名称>;
|
如果在 select_type 中有 derived 的话,则表示使用了 temptable 算法。因此,如果隐藏的衍生表需要很高的代价产生,explain 就会变得性能很低并且执行起来很慢,这是因为它需要实际执行和构建衍生表。这个算法是视图的属性而不会受到查询类型的影响。例如,假设创建视图的时候指定了算法,那么以后针对这个视图的查询都不会更改算法,即便有优化的空间:
1
2
|
create
algorithm=temptable
view
v1
as
select
*
from
country;
|
。
可更新视图可以通过视图更新隐藏的基础表,只要指定的条件保持,就可以使用 update,delete 甚至是 insert 操作,就像操作普通表一样,例如下面的操作是有效的:
1
|
update
oceania
set
population = population * 1.1
where
name
=
'australia'
;
|
如果视图包括 group by,union,聚合函数或其他的一些概念,那么该视图就不可更新。所有使用了 temptable 算法的视图都不可以更新.
check option 子句用于保证任何通过视图更改的数据行在更改后需要保持与视图的 where条件匹配。例如上面的例子,如果插入了一条 continent 值不同的行,服务端就会报错.
。
很多人不会考虑使用视图提升性能,但是在某些情况下视图是可以提高性能的。而且还可以用视图去提升其他方面的性能,例如,在表结构重构时,被修改的数据表的视图不经修改也可以使用。还可以使用视图实现字段权限控制而不增加创建列权限的负荷:
1
2
3
4
|
create
view
public
.employeeinfo
as
select
firstname, lastname
--不包含身份证号
from
private.employeeinfo;
grant
select
on
public
.*
to
public_user;
|
使用 temptable 算法的视图性能可能很糟糕(虽然也有可能比等效的 sql 查询性能高)。这种视图可优化的空间不高.
视图可能让开发者误以为视图很简单,而事实上视图非常复杂。如果开发者不懂的试图的复杂性,那么就不会注意到视图与普通表查询之间的差别。如果使用explain 指令的话有时候会发现产生上百行的分析结果输出,这是因为实际看起来是数据表的查询实际是视图,而视图可能引用其他数据表甚至是其他视图.
在使用视图改进性能时,需要仔细分析和测试。即便是 merge 算法的视图也会增加额外的负担,而且很难预测对性能的影响。视图实际在 mysql 中使用了另外的优化途径。在高并发场景,视图可能导致查询优化器耗费大量时间在做计划和统计,甚至导致服务端卡顿。这个时候需要使用普通的 sql 来替代视图.
。
mysql 不像其他数据库服务器那样支持物理视图(物理视图即产生并将结果存在一个不可见的数据表中,并周期性地更新以从源数据刷新视图)。mysql 也不支持视图的索引。mysql 也不会保留视图的原始 sql,如果我们视图通过执行 show create view 指令去编辑视图,并且更改返回结果 sql,会发现结果很奇特。查询sql会按规范展开,并且使用内部的格式包裹,且没有格式化、注释和缩进.
以上就是mysql 视图(view)原理解析的详细内容,更多关于mysql 视图(view)原理的资料请关注我其它相关文章! 。
最后此篇关于MySQL 视图(View)原理解析的文章就讲到这里了,如果你想了解更多关于MySQL 视图(View)原理解析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
阅读目录 1、视图介绍 2、创建视图 3、查询视图 4、修改视图 5、删除视图 6、检查选项
基于函数的视图你已经get了,基于类的视图get了吗?CBV本质不知道?点进来看源码分析~ Django 视图之FBV 与 CBV FBV(function base views) 基于函数的视图,就
SQLite 视图(View) 视图(View)只不过是通过相关的名称存储在数据库中的一个 SQLite 语句。视图(View)实际上是一个以预定义的 SQLite 查询形式存在的表的组合。 视图
视图 什么是视图?视图的作用是什么? 视图(view)是一种虚拟存在的表,是一个逻辑表,它本身是不包含数据的。作为一个select语句保存在数据字典中的。 通过视图,可以展现基表(用来创建视图
代码如下: CREATE OR REPLACE VIEW BLOG_V_ADMIN (ID,NICKNAME,SEX,EMAIL,
创建视图 视图包含应用的 HTML 代码,并将应用的控制器逻辑和表现逻辑进行分离。视图文件存放在 resources/views 目录中。下面是一个简单的视图示例:
加密测试的存储过程 ? 1
简介数据库快照 数据库快照,正如其名称所示那样,是数据库在某一时间点的视图。是SQL Server在2005之后的版本引入的特性。快照
一 ,mysql事务 MYSQL中只有INNODB类型的数据表才能支持事务处理。 启动事务有两种方法 (1) 用begin,rollback,commit来实现 复制代码代码如
前言 在日常开发中,存储数据的最常用的方式便是数据库了,其中最为著名的便是MySQL数据库,因它简便易于上手而且可扩展性强大,跨平台使得它广为使用。上一篇文章,我们讲到了它的安装,今天我们就来
1、视图 视图:VIEW,虚表,保存有实表的查询结果,实际数据不保存在磁盘 物化视图:实际数据在磁盘中有保存,加快访问,MySQL不支持物化视图 基表:视图依赖的表 视图中的数据事实上
事项开启和使用 ? 1
代码如下: create PROCEDURE sp_decrypt(@objectName varchar(50)) AS begin begin tran&
前言 在之前 《Oracle打怪升级之路一》中我们主要介绍了Oracle的基础和Oracle常用查询及函数,这篇文章作为补充,主要介绍Oracle的对象,视图、序列、同义词、索引等,以及PL/SQL编
我是一名优秀的程序员,十分优秀!