mysql视图管理方法(MySQL 视图View原理解析)
mysql视图管理方法
MySQL 视图View原理解析mysql 5.0以后引入了视图。视图实际是一个自身不存储数据的虚拟数据表。实际这个虚拟表的数据来自于访问视图的 sql 查询的结果。mysql 处理视图和处理数据表差不多,通过这种方式来满足很多需求。视图和数据表在 mysql 中共享命名空间,然而 ,mysql 处理而二者的方式并不相同,例如,视图没有触发器,并且无法使用 drop table 移除视图。
下面以 world 样例数据库为例来展示视图的工作机制。
|
create view oceania as select * from country where continent = 'oceania' with check option ; |
实现视图最简单的方式是执行select查询语句并将结果放入到一张临时表中。之后,就可以在视图出现的地方引用这张临时表。例如下面的查询语句:
|
select code, name from oceania where name = 'australia' ; |
下面是服务端执行上面语句可能的形式(临时表名称是随意取的,实际内部不知道是什么):
|
create temporary table tmp_oceania_123 as select * from country where continent = 'oceania' ; select code, name from tmp_oceania_123 where name = 'australia' ; |
这种形式显然存在性能问题,最好的方式是将视图和查询的分布查询改为一句 sql 语句,如下所示:
|
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 指令检查:
|
explain select * from <视图名称>; |
如果在 select_type 中有 derived 的话,则表示使用了 temptable 算法。因此,如果隐藏的衍生表需要很高的代价产生,explain 就会变得性能很低并且执行起来很慢,这是因为它需要实际执行和构建衍生表。这个算法是视图的属性而不会受到查询类型的影响。例如,假设创建视图的时候指定了算法,那么以后针对这个视图的查询都不会更改算法,即便有优化的空间:
|
create algorithm=temptable view v1 as select * from country; |
可更新视图
可更新视图可以通过视图更新隐藏的基础表,只要指定的条件保持,就可以使用 update,delete 甚至是 insert 操作,就像操作普通表一样,例如下面的操作是有效的:
|
update oceania set population = population * 1.1 where name = 'australia' ; |
如果视图包括 group by,union,聚合函数或其他的一些概念,那么该视图就不可更新。所有使用了 temptable 算法的视图都不可以更新。
check option 子句用于保证任何通过视图更改的数据行在更改后需要保持与视图的 where条件匹配。例如上面的例子,如果插入了一条 continent 值不同的行,服务端就会报错。
视图的性能
很多人不会考虑使用视图提升性能,但是在某些情况下视图是可以提高性能的。而且还可以用视图去提升其他方面的性能,例如,在表结构重构时,被修改的数据表的视图不经修改也可以使用。还可以使用视图实现字段权限控制而不增加创建列权限的负荷:
|
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怎么把行变列(MySQL 中行转列的方法)
- mysql查看视图注释(详解MySQL的sql_mode查询与设置)
- mysql时间存储如何选择(MySQL如何使用时间作为判断条件)
- MySql开启远程连接
- mysql各种查询方式(mysql查询的控制语句图文详解)
- mysql读写分离怎么实现的(详解MySQL主从复制及读写分离)
- mysql字符类型长度限制
- mysql删库操作记录(mysql常用sql与命令之从入门到删库跑路)
- mysql5.7详细安装教程(MySQL5.7.33安装过程图文详解)
- 如何查找MySQL中查询慢的SQL语句
- thinkphp5.1手动连接mysql数据库(thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例)
- mysql exists的用法(Mysql exists用法小结)
- mysql怎么删除用户操作(解决mysql删除用户 bug的问题)
- phpstudy怎么升级mysql(phpStudy中升级MySQL版本到5.7.17的方法步骤)
- mysql架构方案讲解(MySQL 搭建MHA架构部署的步骤)
- 忘记mysql密码怎么登录(Mysql用户忘记密码及密码过期问题的处理方法)
- 今日菜价 芥兰涨幅最高 1.33 ,花菜降幅最高 3.10(今日菜价芥兰涨幅最高)
- 今日菜价 椰菜涨幅最高 3.25 ,水空心菜降幅最高 2.58(今日菜价椰菜涨幅最高)
- 今日菜价 红三鱼涨幅最高 4.41 ,黄鳝降幅最高 5.06(红三鱼涨幅最高)
- 今日菜价 西生菜涨幅最高 6.19 ,生菜降幅最高 5.38(西生菜涨幅最高)
- 今日菜价 青豆角涨幅最高 0.70 ,菜心降幅最高 5.55(青豆角涨幅最高)
- 农村植物,龙芽草若长在您家路旁,请珍惜,它对抗癌有特效(龙芽草若长在您家路旁)
热门推荐
- python3循环使用教程(Python3.4学习笔记之 idle 清屏扩展插件用法分析)
- dedecms安全设置(织梦dedecms站点data目录位置变动调整验证码不显示的解决办法)
- css样式基础知识(CSS深入教程之文字修饰的那点事)
- access标签名称属性(htaccess 防盗链,防止目录浏览等10大技巧)
- html5应用的几个建议
- 10款免费好用的云服务器/VPS主机控制面板推荐(10款免费好用的云服务器/VPS主机控制面板推荐)
- 在mysql语法中用来修改数据的命令(explain命令为什么可能会修改MySQL数据)
- js闭包可以解决哪些问题(JavaScript中let避免闭包造成问题)
- 宝塔数据库不小心删了(宝塔面板MySQL数据库经常自动停止的解决方法)
- dedecms添加代码(dedecms 栏目目录用首字母生成的方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9