mysql技术分享-- 视图是什么

视图

  • 最近遇到mysql锁相关问题,在查阅资料时候,经常能看到在锁的解释中总有视图的概念出现,因此我觉得有必要先去了解一下视图相关的详细信息,有助于我对mysql锁相关的理解。
  • 视图(View)是一个命名的虚拟表,由一个查询来定义,可以当成表使用。与持久表(permanent table)不同的是,视图中的数据没有物理表现形式(没有存储在文件)

视图的作用

  • 视图在我们实际应用开发时候接触的比较少,但是他在数据库中扮演着重要的角色。视图的主要用途之一就是被用做一个抽象的装置,特别是对于某些场景下应用程序,程序不需要关心基础表(base table)的结构,只需要按照视图定义来获取数据,或者更新数据。因此视图同时在一定程度上起到一个安全层的作用。

  • mySql 的5.0 版本后才支持视图,预发格式如下:

CREATE VIEW <视图名> AS <SELECT语句>
  • 视图名:指定视图的名称,名称在数据库中必须是唯一的,不能与其他表或者视图同名

  • select 语句:指定创建视图的select语句,可以用于查询多个基础表的源视图。

  • 视图是基于表的一个虚拟表,但是我们可以对某些视图进行更新操作,其实就是通过视图定义来更新基本表,这种可以进行更新操作的视图是可更新视图(updatable view)。视图中定义的WITH CHECK OPTION 就是针对可更新视图做的设置。看如下案例:

create table t(id int);create view v_t as select * from t where id<10;insert into v_t select 20;select * from v_t;insert into v_t VALUES (9);select * from v_tselect * from t
  • 创建一个id< 10的视图,但是往里插入了id为20的值,插入操作并没有报错,但是我们查询视图还是没有能查到的数据。但是我们在t中是可以看到有两天数据进行了insert, 我们可以修改一下视图的定义,加上WITH CHECH OPTION:
alter view v_t as select * from t where id < 10 with check option;insert into v_t select 30;
  • 本次mysql数据操作后得到错误信息i:
[SQL]
insert into v_t select 30[Err] 1369 - CHECK OPTION failed 'test.v_t'
  • 在添加with check option后mySql数据库会对更新视图插入的数据进行检查,对于不满足视图定义的条件的数据,抛出异常,不允许更新

  • mySql常用命令show tables, 会展示当前数据库下的表,视图是虚表,同样会被查询出。
    在这里插入图片描述

  • mysql中有对应的语法用来查询基础表,排除视图:

select * from information_schema.TABLES where TABLE_TYPE = 'BASE TABLE' and TABLE_SCHEMA = DATABASE();

在这里插入图片描述

  • 单独查询视图内容:
select * from information_schema.VIEWS where TABLE_SCHEMA = DATABASE();

在这里插入图片描述

物化视图

  • Oracle数据库才支持物化视图----该视图不是基于基表的虚表,而是根据基表实际存在的实体表。可以用于预先计算并保存表的其他纬度信息,这样在执行复杂查询时候,可以避免进行耗时的一些操作,快速得到结果

  • 物化视图需要解决的一个问题在于当基础表发送DML操作后,物化视图必须跟进,刷新模式有两种:

    • ON DEMAND :物化视图在用户使用时候进行刷新
    • ON COMMIT:在对基础表DML操作提交同时进行刷新
  • 刷新方法有四种:

    • FAST:增量刷新,只刷新上次刷新以后进行的修改
    • COMPLETE:对整个物化视图进行全量的刷新
    • FORCE:刷新时候回判断是否可以进行快速刷新,如果可以就采用FAST,否则用COMPLETE
    • NEVER:不进行任何刷新
  • 以上物化视图都是Oracle数据库才支持,MySQL数据库本身并不支持,也就是MySQL中视图总数虚拟的,当我们可以通过一些机制来实现,例如创建一个ON DEMAND的物化视图还是比较简单,可以定时将数据导入另外一张表,例如有如下订单表:


create table orders(
order_id int UNSIGNED not null AUTO_INCREMENT,
product_name VARCHAR(30) not null,
price DECIMAL(8,2) not null,
amount SMALLINT not null,
PRIMARY KEY (order_id)
)ENGINE=INNODBinsert into orders values
(null, 'cpu', 138.2,1),
(null, 'memory', 89.2,5),
(null, 'cpu', 98.2,6),
(null, 'cpu', 333.2,33);select * from orderscreate table orders_mv(
product_name varchar(30) not null,
price_sum DECIMAL(8,2) not null,
amount_sum int not null,
price_avg FLOAT not null,
orders_cnt int not null,
UNIQUE INDEX(product_name)
);INSERT into orders_mv
select product_name, sum(price), SUM(amount), AVG(price),count(*) from orders GROUP BY product_name;select * from orders_mv
  • orders 数据:
    在这里插入图片描述

  • orders_mv 数据
    在这里插入图片描述

  • 如上方式我们吧物化视图定义为一张表,不过我们以mv结尾,让DBA很好的理解这张表的作用,这样就有了一个统计信息,如果是要实现ON DEMAND的物化视图,只需要吧表清空,重新导入即可。这种方式是Complete刷新方式

  • FAST刷新方式也是可以的,每次刷新纪录上次order_id的位置,下次更新之后的数据。

  • ON COMMIT方式的话就不容易了,Oracle数据库中通过物化视图日志来实现的,mySQL没有这个功能,mySQL需要实现的话可以通过触发器实现。(略)

上一篇:数据结构与索引-- mySql索引诡异事件
下一篇:mysql技术分享–表分区实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Visual Studio 2019 中为 .NET Core WinForm App 启用窗体设计器

当我们在使用 Visual Studio 2019 非预览版本开发 Windows Forms App (.NET Core) 应用程序时是不能使用窗体设计器的。即使在窗体文件上右击选择“显示设计器”菜单&#xff0c;仍旧只能看到代码&#xff0c;无法打开窗体设计器。根据微软开发者博客的描述&#xff0c;我们可以…

mysql技术分享--表分区实现

分区表 分区概念 分区功能并不是在存储引擎层完成的&#xff0c;因此不止有InnoDB存储引擎支持分区&#xff0c;常见的存储引擎MyISAM&#xff0c;NDB等都支持。但是也并不是所有存储引擎都支持&#xff0c;比如CSV&#xff0c;FEDERATED&#xff0c;MERGE等就不支持&#xf…

视频号,张小龙的星辰大海

阅读本文大概需要 4.1分钟。前段时间&#xff0c;微信开通了视频号。本想第一时间写一篇文章&#xff0c;分析下视频号。发现理解还不深入&#xff0c;于是这段时间一直在思考视频号对微信的战略意义和它的前景。思考了接近1个月&#xff0c;想明白了一些事情&#xff0c;有时候…

[Java基础]List集合子类特点

ArrayList练习: package test19;import java.util.ArrayList; import java.util.Iterator;public class ArrayListDemo {public static void main(String[] args){ArrayList<String> array new ArrayList<String>();array.add("hello");array.add(&quo…

[半翻] 设计面向DDD的微服务

这篇文章行文结构对照微软博客&#xff0c; 结合本人意译和多年实践的回顾性思考形成此次读书笔记。Domian-driven Design领域-驱动-设计&#xff08;DDD&#xff09;提倡基于(用例相关的现实业务)进行建模。1. DDD的视角DDD将现实问题视为领域;DDD将独立的问题描述为有界限的上…

【值得收藏】首次披露Facebook移动端软件的持续部署 | IDCF

&#xff08;图片来源于网络&#xff09;摘要持续部署是指软件更新一旦准备好就立即发布的实践方法&#xff0c;在业界越来越多地被采用。移动端软件的更新频率普遍落后于基于云端的服务&#xff0c;原因有很多。比如&#xff0c;移动端软件只能定期发布版本&#xff1b;用户可…

数据结构与算法--二叉树的深度问题

二叉树的深度 题目&#xff1a;输入一颗二叉树的根&#xff0c;求该树的深度。从根节点到叶子节点一次进过的节点形成的一条路径&#xff0c;最长的路径的长度为树的深度。如下图中二叉树的额深度4&#xff0c;因为从根节点A到叶子节点的路径中有4个节点A B E J 问题中定义了一…

进击谷歌:多线程下程序执行顺序怎么稳定不乱?

点击上方蓝字 关注我们面试官您好&#xff0c;我是来面试的您好&#xff0c;我是这次的面试官&#xff0c;先介绍一下自己把我是女孩&#xff0c;blala ....那问一个多线程的问题吧&#xff0c;在一个多线程的环境中&#xff0c;怎么能保证一系列方法的执行顺序呢&#xff1f;…

[Java基础]Set集合概述和特点

练习代码如下: package test21;import java.util.HashSet; import java.util.Set;public class SetDemo {public static void main(String[] args){Set<String> set new HashSet<String>();set.add("hello");set.add("world");set.add("…

深圳本次核酸检普筛怎么将个人信息和结果对应上??

前言 最近深圳疫情比较严重&#xff0c;好在上午新闻公布本次普筛都是阴性&#xff0c;期间我检查了三次&#xff0c;基本上每周测一次的样子&#xff0c;基本的检测非常快&#xff0c;只是需要筛查的人数太多&#xff0c;因此才有几公里的排队出现&#xff0c;期间也发现了一…

借助Redis完成延时任务

背景 相信我们或多或少的会遇到类似下面这样的需求&#xff1a;第三方给了一批数据给我们处理&#xff0c;我们处理好之后就通知他们处理结果。大概就是下面这个图说的。本来在处理完数据之后&#xff0c;我们就会马上把处理结果返回给对方&#xff0c;但是对方要求我们处理速度…

[Java基础]HashSet集合概述和特点

HashSet集合概述和特点: 练习代码如下: package HashSetPackage;import java.util.HashSet;public class HashSetDemo {public static void main(String[] args){HashSet<String> hs new HashSet<String>();hs.add("hello");hs.add("world")…

多亏我缓存技术过硬!疫情防控项目上线,我只用了5天!

先介绍下背景&#xff0c;我是武汉某O2O电商公司开发组长&#xff0c;疫情震中的我被老板要求7天之内上线《疫情防控热点图》项目&#xff0c;几个组员回老家断网&#xff0c;最终就2个人完成开发上线&#xff0c;满足了10w用户的高频访问。时间和人力都紧张&#xff0c;不能按…

数据结构与算法--有序数组中找出和为s的两个数字

有序数组中找和为s的两个数字 题目&#xff1a;输入一个递增排序的数组array&#xff0c; 和一个数字s&#xff0c; 在数组中找出两个数&#xff0c;使得这两个数的和是s&#xff0c;如果有多对&#xff0c;输出一对即可。 最简单方案 双循环&#xff0c;每次获取一个数据&a…

ABP框架使用拦截器动态配置租户过滤器

前言最近项目要求在ABP框架中根据TenantId是否为空来配置是否禁用租户过滤器。ABP自身给我我们禁用租户过滤器的两种方法官方文档https://aspnetboilerplate.com/Pages/Documents/Data-Filters方法一&#xff1a;使用工作单元using (_unitOfWorkManager.Current.DisableFilter(…

[Java基础]LinkedHashSet集合概述和特点

练习代码如下: package LinkedHashSetPack;import java.util.LinkedHashSet;public class LinkedHashSetDemo {public static void main(String[] args){LinkedHashSet<String> linkedHashSet new LinkedHashSet<String>();linkedHashSet.add("hello")…

数据结构与算法--翻转单词顺序

翻转单词顺序 题目&#xff1a;输入一个英文句子&#xff0c;翻转句子中的单词顺序&#xff0c;但是单词内的字符顺序不变&#xff0c;例如&#xff1a;I am a software engineer -> engineer software a am I 方案一&#xff1a;空间换时间 空间换时间方法&#xff0c;还…