免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1582 | 回复: 0
打印 上一主题 下一主题

Mysql学习系列之五:视图 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-19 17:51 |只看该作者 |倒序浏览

                               

  Normal
  0
  
  
  
  7.8 磅
  0
  2
  
  false
  false
  false
  
  EN-US
  ZH-CN
  X-NONE
  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  
  
   
   
   
   
   
   
   
   
   
   
   
  

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  

/* Style Definitions */
table.MsoNormalTable
        {mso-style-name:普通表格;
        mso-tstyle-rowband-size:0;
        mso-tstyle-colband-size:0;
        mso-style-noshow:yes;
        mso-style-priority:99;
        mso-style-qformat:yes;
        mso-style-parent:"";
        mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
        mso-para-margin:0cm;
        mso-para-margin-bottom:.0001pt;
        mso-pagination:widow-orphan;
        font-size:10.5pt;
        mso-bidi-font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-ascii-font-family:Calibri;
        mso-ascii-theme-font:minor-latin;
        mso-hansi-font-family:Calibri;
        mso-hansi-theme-font:minor-latin;
        mso-font-kerning:1.0pt;}
table.MsoTableGrid
        {mso-style-name:网格型;
        mso-tstyle-rowband-size:0;
        mso-tstyle-colband-size:0;
        mso-style-priority:59;
        mso-style-unhide:no;
        border:solid black 1.0pt;
        mso-border-themecolor:text1;
        mso-border-alt:solid black .5pt;
        mso-border-themecolor:text1;
        mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
        mso-border-insideh:.5pt solid black;
        mso-border-insideh-themecolor:text1;
        mso-border-insidev:.5pt solid black;
        mso-border-insidev-themecolor:text1;
        mso-para-margin:0cm;
        mso-para-margin-bottom:.0001pt;
        mso-pagination:widow-orphan;
        font-size:10.5pt;
        mso-bidi-font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-ascii-font-family:Calibri;
        mso-ascii-theme-font:minor-latin;
        mso-hansi-font-family:Calibri;
        mso-hansi-theme-font:minor-latin;
        mso-font-kerning:1.0pt;}
Mysql视图基础
修改视图需要create view 和 delete 权限。
表和视图的命令在同一个命名空间中,所以同一个数据库不能有表名和视图名重复。
可以对其他数据库中的表建视图
视图的定义有以下的限制:
1、from子句中不能有子查询
2、select不能指向系统或者用户的变量
3、select不能指向prepared语法参数
4、定义中的表或视图必须存在
5、不能对临时表建视图,也不能建临时视图
6、视图定义中的表名必须已经存在
7、不能在触发器和视图之间建关联
ORDER BY可以用在视图定义中,但是如果访问视图的select中使用的order by,则视图定义中的ORDER BY被忽略。
语法:

  
  CREATE [OR REPLACE] [ALGORITHM
  = {UNDEFINED | MERGE | TEMPTABLE}]
  VIEW view_name [(column_list)]
  AS select_statement
  [WITH [CASCADED | LOCAL] CHECK OPTION]
  

ALGORITHM扩展了标准sql,有三个值,默认值是UNDEFINED,预算法则决定了mysql如何处理视图。
对于临时表方式,会将视图的结果放置到临时表中,然后使用临时表执行sql,这样的好处是在临时表建完之后,就会释放在原表上面的锁,这样比MERGE方式更快的释放在访问的表上的锁。
对于UNDEFINED方式,是指有系统自己决定使用临时表方式还是MERGE方式,MERGER方式更高效,且临时表方式不能更新视图的数据。
对于MERGE方式,实际上是把访问视图的SQL拼接到视图本身的sql上面。要求视图的行和表的行之间是一一对应的,如果不存在
这样的一一对应的关系,则会切换到临时表算法。
包含以下关键字的sql,不能使用merge方式:

  
  DROP VIEW [IF EXISTS]
  view_name [, view_name] ...
  [RESTRICT | CASCADE]
  

显示视图内容:

  
  SHOW CREATE VIEW view_name
  



MySQL中的视图及性能问题
视图是
MySQL
5.0中增加的三大新功能之一(另外两个是存储过程与触发器),也是一般稍微“高级”一点的数据库所必需要有的功能。

MySQL在定义
视图
上没什么限制,基本上所有的查询都可定义为视图,并且也
支持可更新视图(当然只有在视图和行列与基础表的行列之间存在一一对应关系时才能更新),因此从功能上说MySQL的视图功能已经很完善了。
2yo*|2xGs!WR+a0
*G­U6n9u4w*i1R0然而若要在应用中使用视图,还需要了解处理视图时的
性能
,而MySQL在这方面问
题是比较大的,需要特别注意。
首先要知道MySQL在处理视图时有两种算法,分别称为MERGE和TEMPTABLE。在执行"CREATE VIEW"语句时可以指定使用哪种算法。

所谓MERGE是指在处理涉及到视图的操作时,将对视图的操作根据视图的定义进行展开,有点类似于C语言中的宏展开。比如设有以下的表(类似于博客中的评论):



  
  CREATE TABLE `comment` (
    `id` int(11) NOT NULL,
    `user_id` int(11) default NULL,
    `content` varchar(255) default NULL,
    PRIMARY KEY  (`id`),
    KEY `idx_comment_uid` (`user_id`)
  ) ENGINE=InnoDB;
  

+sa4@}:I8R u0
9l
T'ia#? ],L‑]} K0假设user_id 的用户为VIP用户,我们可以这样创建一个视图来表示VIP用户的评论:木铎校园 BBS 社区;j`_9J‑n9Y:x
CREATE VIEW vip_comment AS SELECT * FROM comment WHERE user_id qG3Ku8ql,e0p7o,p0这时我们在操作vip_comment视图时使用的就是MERGE算法。如:

  
  mysql > EXPLAIN EXTENDED
  SELECT count(*) FROM vip_comment WHERE user_id  show warnings;
  +-------+------+---------------------------------------------------------------------------------------------------------------------------------------+
  | Level | Code |
  Message                                                                                                                              
  |
  +-------+------+---------------------------------------------------------------------------------------------------------------------------------------+
  | Note  | 1003 | select count(0) AS `count(*)` from `test`.`comment`
  where ((`test`.`comment`.`user_id` 木铎校园 BBS 社区H*nF!~ld-]z
  
  
  

4GT
Es,um
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP