Mysql视图的作用及其性能分析
定义:视图是从一个或几个基本表导出的表,它与基本表不同,是一个虚表。
作用:
1.简化操作,不用进行多表查询。
2.当不同种类的用用户共享同一个数据库时,非常灵活,(用户以不同的
方式看待同一数据.
3.视图对重构数据库提供了一定程度的逻辑独立性。
数据的逻辑独立性是指:如增加新的关系或对原有的关系增加新的
字段,用户的应用程序不受影响.
例如:原有一个Student(Sno,Sname,Ssex,Sage,Sdept)这样一个表.
后来变动为:Sx(Sno,Sname,Sage)和SY(Sno,Ssex,Sdept)
两个表。
这时候原表Student为SX和SY表自然连接的结果。
那么如果我们一开始建立了一个试图:
create view Student(Sno,Sname,Ssex,Sage,Sdept)
as select SX.Sno,SX.Sname,SY.Ssex,SX,Sage,SY,Sdept
from SX,SY where SX.Sno=SY.Sno;
尽管数据库的逻辑结构改变了,但是应用程序不必修改(因为这个这个
视图所定义的关系没有变啊)。
【注意:试图只能在一定程度上提供数据的逻辑独立,比如由于
视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会
因为基本表构造的改变而改变.
4. 视图能够对机密数据提供安全保护
有了视图机制,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,使机密数据不出现在不应该看到这些数据 的用户视图上。这样视图机制就自动提供了对机密数据的安全保护功能。例如,Student表涉及全校15个院系学生数据,可以在其上定义15个视图,每个视图只包含一个院系的学生数据,并只允许每个院系的主任查询和修改本原系学生视图。
5、适当的利用视图可以更清晰地表达查询
例如经常需要执行这样的查询“对每个学生找出他获得最高成绩的课程号”。可以先定义一个视图,求出每个同学获得的最高成绩:
CREATE VIEW VMGRADE
AS
SELECT Sno,MAX(Grade) Mgrade
FROM SC
GROUP BY Sno;
然后用如下的查询语句完成查询:
SELECT SC.Sno,Cno FROM SC,VMGRADE WHERE SC.Sno = VMGRADE.Sno AND SC.Grade = VMGRADE.Mgrade;
MySql视图的算法及其性能分析:
mysql在处理视图时有两种算法,分别称为merge和temptable。
在执行“create view”语句时可以指定使用哪种算法,所谓merge是指在
处理涉及到视图的操作时,将对视图的操作根据视图的定义进行展开,有点类似于
c语言中的宏展开.
例如设有以下表:
【一般在能够使用merge算法的时候mysql处理视图上没什么性能问题,
但并非在任何时候都能使用merge算法.事实上,只要视图的定义稍稍有点复杂,mysql就没办法使用merge算法了.准确的说,只要视图定义中
使用了一下sql构造块就无法使用merge算法:
(1)聚集函数(2)distinct (3)group by (4)having
(5)having (6)集合操作(在mysql只有union,union all,没有except和intersect)(7)子查询.】
确实,在视图定义比较复杂的情况下,要对视图操作进行有效的优化是非常困难的。因此在这个时候,MySQL使用了一种以不变应万变的方法,即先执行视图定义,将其结果使用临时表保存起来,这样后续对视图的操作就转化为对临时表的操作。不能不说从单从软件设计的角度看,这样的方法非常的优雅,然而从性能角度,这一方法也是非常的差。
比如我们希望使用如下的视图来表示每个用户的评论数,即:
CREATE VIEW comment_count AS SELECT user_id, count(*) AS count FROM comment GROUP BY user_id;
使用这个视图的时候,我们可能心里有个小算盘。目前我们先用这个视图顶着,如果性能确实有问题,那我们就 再来搞一张comment_count的表,其中就记下来每个用户的评论数。而我们现在先用这个视图是为了将来要 是改的话会方便点(这也是视图--即教科书中所谓的外模式--这个东西存在的主要原因之一,另一主要原因是 便于权限控制)。但是遇到了MySQL这个蠢货,我们的算盘铁定会失败。
我们来看一下指定user_id从comment_count选取记录时的执行策略:
mysql> explain select count(*) from comment_count where user_id = 90;
可以看出,mysql首先是先执行comment_count的视图定义,
将结果存储在临时表中,选择出满足"user_id=90”的那一条
记录,这样,虽然我们最终只需要统计90号用户的评论数,并且comment
表的user_id字段也有索引,mysql也会扫描整个comment表,并按
user_id分组计算出所有用户的评论数。
【这里面要注意的是即使在进行explain时,系统的物化也是要先执行的,
因此若评论很多的话explain也是一样的慢。这个问题的根源是
mysql的查询优化本来就存在很多问题.对于上述的查询,要达到比较
好的优化效果在数据库中一般是如下处理的:
1.将视图的操作转化为from字句中的子查询.
select * from (select user_id,count(*) as count from comment
group by user_id)as comment_count where user_id=90;
2.子查询提升。因为子查询中使用了group by,因此先将外面的条件
作为提升后的having条件
select user_id,count(*) as count from comment group by usr_id
having user_id=90;
3.由于having条件中不涉及聚集函数,转化为where条件
select user_id ,count(*) as count from comment where user_id=90
group by user_id;
4.由于指定where条件后,user_id已经是一个常数,根据常数group by
没有意义,因此去掉group by。
select user_id,count(*) as count from comment where user_id=90
除第4步无法根据EXPLAIN输出和查询性能判断出MySQL是否进行这一优化外,前3类优化MySQL都不会进行。因此,MySQL要能够有效的处理上述查询还有很长的路要走。
Mysql视图的作用及其性能分析的更多相关文章
- MYSQL索引结构原理、性能分析与优化
[转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...
- 【转】由浅入深探究mysql索引结构原理、性能分析与优化
摘要: 第一部分:基础知识 第二部分:MYISAM和INNODB索引结构 1.简单介绍B-tree B+ tree树 2.MyisAM索引结构 3.Annode索引结构 4.MyisAM索引与Inno ...
- 由浅入深探究mysql索引结构原理、性能分析与优化 转
第一部分:基础知识 第二部分:MYISAM和INNODB索引结构 1. 简单介绍B-tree B+ tree树 2. MyisAM索引结构 3. Annode索引结构 4. MyisAM索引与Inno ...
- 由浅入深探究mysql索引结构原理、性能分析与优化
摘要: 第一部分:基础知识 第二部分:MYISAM和INNODB索引结构 1.简单介绍B-tree B+ tree树 2.MyisAM索引结构 3.Annode索引结构 4.MyisAM索引与Inno ...
- [转载]由浅入深探究mysql索引结构原理、性能分析与优化
第一部分:基础知识第二部分:MYISAM和INNODB索引结构1. 简单介绍B-tree B+ tree树 2. MyisAM索引结构 3. Annode索引结构 4. MyisAM索引与InnoDB ...
- mysql视图的作用(详细)
测试表:user有id,name,age,sex字段 测试表:goods有id,name,price字段 测试表:ug有id,userid,goodsid字段 视图的作用实在是太强大了,以下是我体验过 ...
- 数据切分——Mysql分区表的建立及性能分析
Mysql的安装方法可以参考: http://blog.csdn.net/jhq0113/article/details/43812895 Mysql分区表的介绍可以参考: http://blog.c ...
- mysql视图的作用
测试表:user有id,name,age,sex字段 测试表:goods有id,name,price字段 测试表:ug有id,userid,goodsid字段 视图的作用实在是太强大了,以下是我体验过 ...
- (转)MySQL join语法解析与性能分析
文章转载的:http://www.cnblogs.com/BeginMan/p/3754322.html 一.join语法概述 join用于多表中字段之间的联系,语法如下: ... FROM tabl ...
随机推荐
- 龙芯将两款 CPU 核开源,这意味着什么?
10月21日,教育部计算机类教学指导委员会.中国计算机学会教育专委会将2016 CNCC期间在山西太原举办“面向计算机系统能力培养的龙芯CPU高校开源计划”活动,在活动中,龙芯中科宣布将GS132和G ...
- WCF入门(九)--WCF实例管理
这组由Windows通讯基础(WCF)结合一组消息(客户端请求)服务实例所采用的技术被称为实例管理.一个完全由三种类型实例激活支持WCF,它们如下所述. 1.每个调用服务 每次调用服务是Windows ...
- C++:类模板与模板类
6.3 类模板和模板类 所谓类模板,实际上是建立一个通用类,其数据成员.成员函数的返回值类型和形参类型不具体指定,用一个虚拟的类型来代表.使用类模板定义对象时,系统会实参的类型来取代类模板中虚拟类型从 ...
- C++:运算符重载函数之"++"、"--"、"[ ]"、"=="的应用
5.2.5 "++"和"--"的重载 对于前缀方式++ob,可以用运算符函数重载为: ob.operator++() //成员函数重载 或 operator++ ...
- jQuery 、js 设置 显示隐藏
小问题 jQuery 操作方式: $("#ddl").parent().attr("style", "display:none"); j ...
- JDBC学习总结(四)
JDBC对LOB的读写 在JDBC中提供了java.sql.Blob和java.sql.Clob,两个类分别代表BLOB和CLOB数据. · BLOB(Binary Large Obj ...
- mapper device&lvm
http://www.ibm.com/developerworks/cn/linux/l-devmapper/ http://baike.baidu.com/view/361916.htm?fr=al ...
- ViewPager介绍和使用说明
1 ViewPager实现的功能 和实际运行的效果图示意 ViewPager类提供了多界面切换的新效果.新效果有如下特征: [1] 当前显示一组界面中的其中一个界面. [2] 当用户通过左右滑动界 ...
- Dataguard三种保护模式
Oracle Data Guard 提供三种高水平的数据保护模式来平衡成本.可用性.性能和事务保护.可以使用任意可用管理界面来轻松地设置这些模式.要确定适当的数据保护模式,企业需要根据用户对系统响应时 ...
- svn强制提交备注信息
当我们用tortoisesvn,提交代码时,有很多人不喜欢写注释的,代码版本多了,根本搞不清,哪个版本改了什么东西?所以如果加一些注释的话,我们看起来,也方便很多.所以在提交的时候,我会强制要求,写注 ...