InnoDB的视图

视图(View)是一个命名的虚表,它由一个查询来定义,可以当做表使用。与持久表(permanent table)不同的是,视图中的数据没有物理表现形式。

视图的作用

视图在数据库中发挥着重要的作用。视图的主要用途之一是被用做一个抽象装置,特别是对于一些应用程序,程序本身不需要关心基表(base table)的结构,只需要按照视图定义来获取数据或者更新数据,因此,视图同时在一定程度上起到一个安全层的作用。

MySQL从5.0版本开始支持视图,创建视图的语法如下:

CREATE

[OR REPLACE]

[ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]

[DEFINER={user|CURRENT_USER}]

[SQL SECURITY{DEFINER|INVOKER}]

VIEW view_name[(column_list)]

AS select_statement

[WITH[CASCADED|LOCAL]CHECK OPTION]

虽然视图是基于基表的一个虚拟表,但是我们可以对某些视图进行更新操作,其实就是通过视图的定义来更新基本表,我们称可以进行更新操作的视图为可更新视图(updatable view)。视图定义中的WITH CHECK OPTION就是指对于可更新的视图,更新的值是否需要检查。

我们先看个例子:

create table t(id int);

create view v_t as select * from t where t<10;

ERROR 1054(42S22):Unknown column't'in'where clause'

create view v_t as select * from t where id<10;

insert into v_t select 20;

select * from v_t;

我们创建了一个id<10的视图,但是往里插入了id为20的值,插入操作并没有报错,但是我们查询视图还是没有能查到数据。

接着我们更改一下视图的定义,加上WITH CHECK OPTION:

alter view v_t as select * from t where id<10 with check option;

insert into v_t select 20;

ERROR 1369(HY000):CHECK OPTION failed'mytest.v_t'

这次MySQL数据库会对更新视图插入的数据进行检查,对于不满足视图定义条件的,将会抛出一个异常,不允许数据的更新。

MysQL DBA一个常用的命令是show tables,会显示出当前数据库下的表,视图是虚表,同样被作为表而显示出来,

我们来看前面的例子:show tables;

show tables命令把表t和视图v_t都显示出来了。如果我们只想查看当前数据库下的基表,可以通过information_schema架构下的TABLE表来查询,并搜索表类型为BASE TABLE的表,如:

select * from information_schema.TABLES where table_type='BASE TABLE' and table_schema=database();

要想查看视图的一些元数据(meta data),可以访问information_schema架构下的VIEWS表,该表给出了视图的详细信息,包括视图定义者(definer)、定义内容、是否是可更新视图、字符集等。如我们查询VIEWS表,可得:

select * from information_schema.VIEWS where table_schema=database();

物化视图

Oracle数据库支持物化视图——该视图不是基于基表的虚表,而是根据基表实际存在的实表。物化视图可以用于预先计算并保存表连接或聚集等耗时较多的操作结果,这样,在执行复杂查询时,就可以避免进行这些耗时的操作,从而快速得到结果。物化视图的好处是,对于一些复杂的统计类查询能直接查出结果。在Microsoft SQL Server数据库中,称这种视图为索引视图。

在Oracle数据库中,物化视图的创建方式包括BUILD IMMEDIATE和BUILD DEFERRED这两种。BUILD IMMEDIATE是默认的创建方式,在创建物化视图的时候就生成数据,而BUILD DEFERRED则在创建时不生成数据,以后根据需要再生成数据。

查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果。如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。

物化视图的刷新是指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步

刷新的模式有两种:ON DEMAND和ON COMMIT。ON DEMAND指物化视图在用户需要的时候进行刷新,ON COMMIT指物化视图在对基表的DML操作提交的同时进行刷新。刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。

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=InnoDB;

INSERT INTO Orders VALUES

  (NULL,'CPU',135.5,1),

  (NULL,'Memory',48.2,3),

  (NULL,'CPU',125.6,3),

  (NULL,'CPU',105.3,4);

select * from Orders\G;

接着我们建立一张物化视图,用来统计每件物品的信息,如:

CREATE 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;

这里我们把物化视图定义为一张表,只不过表名以_MV结尾,让DBA能很好地理解这张表的作用。这样就有了一个统计信息,如果是要实现ON DEMAND的物化视图,只需把表清空,重新导入数据即可。当然,这是完全(Complete)刷新方式。要实现快(Fast)刷新方式,其实也是可以的,只不过稍微复杂点,需要记录上次统计时的order_id的位置。

但是如果要实现On Commit的物化视图,这就不是如上面这么简单了。Oracle数据库中通过物化视图日志来实现,很显然MySQL数据库没有这个日志,但是通过触发器,我们同样可以达到这个目的:

DELIMITER$$

CREATE TRIGGER tgr_Orders_insert

AFTER INSERT ON Orders

FOR EACH ROW

BEGIN

  SET@old_price_sum=0;

  SET@old_amount_sum=0;

  SET@old_price_avg=0;

  SET@old_orders_cnt=0;

  SELECT IFNULL(price_sum,0),IFNULL(amount_sum,0),IFNULL(price_avg,0),IFNULL(orders_cnt,0)

  FROM Orders_MV

  WHERE product_name=NEW.product_name

  INTO @old_price_sum,@old_amount_sum,@old_price_avg,@old_orders_cnt;

  SET@new_price_sum=@old_price_sum+NEW.price;

  SET@new_amount_sum=@old_amount_sum+NEW.amount;

  SET@new_orders_cnt=@old_orders_cnt+1;

  SET@new_price_avg=@new_price_sum/@new_orders_cnt;

  REPLACE INTO Orders_MV

  VALUES(NEW.product_name,@new_price_sum,@new_amount_sum,@new_price_avg,@new_orders_cnt);

END;

$$

DELIMITER;

insert into Orders values(NULL,'SSD',299,3);

insert into Orders values(NULL,'Memory',47.9,5);

select * from Orders_MV;

这里对表Orders添加了一个INSERT的触发器,每次Insert操作都会重新统计Orders_MV中的数据,这样就实现了ON_Commit的物化视图功能。但是Orders表可能还会有Update和Delete的操作,所以应该还需要实现Delete和Update的触发器。

通过触发器我们实现了物化视图的功能,但是MySQL本身并不支持物化视图,因此对于物化视图支持的查询重写(Query Rewrite)功能就显得无能为力了。

 

Windows 本地 PostgreSQL 忘记 postgres 密码后,如何重置密码并给 root 用户最高权限 <think>我们只需要根据内容生成摘要,不超过150字。摘要应该简明扼要概括主要问题和解决步骤。注意是中文摘要。</think>在Windows本地开发中,因root数据库账号无CREATEDB权限且忘记postgres超级管理员密码,通过临时修改pg_hba.conf为trust认证重置密码,并重启PostgreSQL服务进行登录,最后授予root用户SUPERUSER等权限,完成数据库创建。 阅读详情

相关推荐

YOLO26科研升级:BiFPN双向特征金字塔,让多尺度特征融合精度再突破

在目录下,新建AddModules文件夹,将bifpn.py放入其中。

LXY_LOVE36的博客 535

MySQL(InnoDB剖析):20---table之(视图、物化视图

一、视图概述 在MySQL数据库中,视图(view)是一个命名的虚表,它由一个SQL查询来定义,可以当做表使用。与持久表不同的是,视图中的数据没有实际的物理存储 二、视图的作用 视图数据库中发挥着重要的作用。视图的主要用途之一是被用做一个抽象装置,特别是对于一些应用程序,程序本身不需要关心基表的结构,只需要按照视图定义来取数据或更新数据,因此,视图同时在一定程度上起到一个安全层的作用 My......

董哥的黑板报 2074

基于STM32F103的智能停车场车位引导系统.zip

基于STM32F103的智能停车场车位引导系统

mysql innodb 视图_InnoDB视图

视图(View)是一个命名的虚表,它由一个查询来定义,可以当做表使用。与持久表(permanent table)不同的是,视图中的数据没有物理表现形式。视图的作用视图数据库中发挥着重要的作用。视图的主要用途之一是被用做一个抽象装置,特别是对于一些应用程序,程序本身不需要关心基表(base table)的结构,只需要按照视图定义来获取数据或者更新数据,因此,视图同时在一定程度上起到一个安全层的作用...

weixin_35626077的博客 241

mysql innodb 视图,简介mysql之视图

前言我们在前文的事务和前文的mysql语句执行流程中都谈到了视图这个概念,其实Mysql有两个视图:1.view,指查询语句过程中定义的虚拟表2.指innodb为实现MVCC时使用到的一致性视图,用于支持可重复读和读提交隔离级别的实现。复习CREATE TABLE `t` (`id` int(11) NOT NULL,`k` int(11) DEFAULT NULL,PRIMARY KEY (`i...

weixin_39909001的博客 204

Innodb 存储引擎 学习笔记 -视图

在MySQL数据库中,视图(view)是一个命名的虚表,与持久表不同,视图中的数据没有实际的物理存储。 举例: 视图是基于基表的一个虚拟表,所以先创建一张基表: 创建该基表的一个视图: 创建了一个id&lt;10的视图。 然后,我们试着向视图插入id=10,id=20两条数据: 由于这两条数据并不满足id&lt;10,因此v_t为空,但插入时并不会报错。 ...

DXT的博客 234

mysql innodb 视图,MySQL InnoDB中的视图有多大?

背景我正在使用带有60个表的MySQL InnoDB数据库,我正在创建不同的视图,以便在代码中快速,轻松地进行动态查询.我有几个关于INNER JOINS(没有多对多关系)的20到28个表的视图选择100到120列,行数低于5,000,它可以快速点亮.实际问题我正在创建一个包含34个表的INNER JOINS(没有多对多关系)的主视图,并选择大约150列,行数低于5,000,看起来它太多了.做一个...

weixin_39668898的博客 128

mysql Innodb、索引、锁、视图

SQL

weixin_45722843的博客 337

Innodb存储引擎-表(约束、视图、物化视图、分区表)

分区功能并不是在存储引擎层完成的,因此不是只有InnoDB存储引擎支持分区,常见的存储引擎 MyISAM、NDB等都支持。但也并不是所有的存储引擎都支持, 如CSV、FEDORATED、MERGE等就不支持。在使用分区功能前,应该对选择的存储引擎对分区的支持有所了解。MySQL 数据库在5.1版本时添加了对分区的支持。分区的过程是将一个表或索引分解为多个更小、更可管理的部分。就访问数据库的应用而言,从逻辑上讲,只有一个表或一个索引,但是在物理上这个表或索引可能由数十个物理分区组成。

迷雾总会解 746

mysql lock_latency_mysql8 参考手册-innodb_lock_waits和x $ innodb_lock_waits视图

这些视图总结了InnoDB事务正在等待的锁。默认情况下,行按锁龄降序排序。在innodb_lock_waits和 x$innodb_lock_waits意见有这些列:wait_started锁定等待开始的时间。wait_ageTIME值 已等待锁多长时间 。wait_age_secs等待锁定的时间(以秒为单位)。locked_table_schema包含锁定表的架构。locked_table_na...

weixin_35460054的博客 580

MySQL进阶【存储引擎、索引、SQL优化、视图、触发器、锁、InnoDB引擎、MySQL管理】

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是 基于库的,所以存储引擎也可被称为表类型。我们可以在创建表的时候,来指定选择的存储引擎,如果 没有指定将自动选择默认的存储引擎。建表时指定存储引擎CREATE TABLE 表名(字段1 字段1类型 [ COMMENT 字段1注释 ] ,......字段n 字段n类型 [COMMENT 字段n注释 ]) ENGINE = INNODB [ COMMENT 表注释 ];查询当前数据库支持的存储引擎。

m0_74818265的博客 986

MySQL InnoDB存储引擎详细介绍之约束、触发器、视图

MySQL通过约束(主键、外键、唯一性等)、触发器和视图三种机制确保数据完整性。约束在表级维护数据规则,触发器自动执行特定操作,视图封装复杂查询简化访问。三者协同工作提升数据库安全性、一致性和开发效率,形成完整的数据库管理方案。

学不可以已,活到老,学到老。 879

linux守护进程

守护进程 Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。 Linux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如:预读入缓输出机制的实现;ftp服务器;nfs服务器等。     创建守护进程,最关键的一步是调用se

oguro的博客 419

项目报错记录

报错目录1、Mapper method 'com.xxx' has an unsupported return type: class xxx.object2、Failed to decode downloaded font3、Uncaught TypeError: Cannot read property 'xx' of null4、Parameter 'xx' not found. Avail...

天黑路夜人漫步 890

INSERT 语句与 FOREIGN KEY 约束"XXX"冲突。该冲突发生于数据库"XXX",表"XXX", column 'XXX。

很多人会遇到上面的问题,我也是:问题由来 1.建立表1              create table Depts              (Dno char(5) primary key,               Dname char(20) not null) 2.建立表2      CREATE TABLE Students

自信的尘埃 www.gocpplua.com 11万+

《MySQL技术内幕:InnoDB存储引擎(第2版)》书摘

MySQL技术内幕:InnoDB存储引擎(第2版) 姜承尧 第1章 MySQL体系结构和存储引擎 >> 在上述例子中使用了mysqld_safe命令来启动数据库,当然启动MySQL实例的方法还有很多,在各种平台下的方式可能又会有所不同。 >> 当启动实例时,MySQL数据库会去读取配置文件,根据配置文件的参数来启动数据库实例。这与Oracle的参...

aecuhty88306453的博客 325

数据库迁移不翻车:golang-migrate 实战,143 个 DDL 有序执行(第97篇-E83)

上一篇 讲了 Agent 怎么测试。但还有一个更基础的问题:数据库 schema 怎么变? 手动跑 SQL 总有人忘了加列、忘了写 down、忘了更新 CI。版本号撞车。dirty 状态没人管。DeepFlux 的答案是:golang-migrate + embed.FS + CI 链守卫 + 哨兵探针。这篇拆解 143 个迁移(000001~000143)是怎么做到不翻车的。

leeyisoft的专栏 188

cpp选手秋招学习笔记 day18

幂等是指一次或多次执行同一个操作,得到的业务结果是相同的,比如对于扣费,客户端因为网络问题重新发出请求,服务端不会进行多次处理,解决方法是可以客户端携带一个独特的唯一的id,然后服务端执行完之后存储这个id,之后新的请求到来比对id。主要是由cpu的内存管理逻辑维护,然后运行时动态的传递给CUDA的kernel,使用的时候传递这个block table,放置在GPU的显存。移动是指把资源的所有者权限转移,原有的变量有效但是状态不确定,赋值是拷贝复制对象,原对象不变。1.什么是幂等,如何保证。

m0_57222081的博客 264

商超智能运营如何落地?从系统架构到实战避坑的完整技术路径

3. **多端交互展示层**:需覆盖顾客使用的**小程序、APP及H5公众号**,以及员工使用的管理后台。答:在应用层引入**适配器模式**。在项目启动时,应强制要求供应商或自研团队产出**部署文档**(含环境变量清单)和**二次开发文档**(含核心流程时序图),确保后续维护不受限于个人。- **多租户插件**:MyBatis Plus的`TenantLineInnerInterceptor`可实现SQL层面的自动拼接`store_id`条件,防止开发者因SQL编写疏漏导致的数据越权。

weixin_56812938的博客 383
上一篇: 走进AngularJs(一)angular基本概念的认识与实战
下一篇: MIPS中的异常处理和系统调用【转】
weixin_33725807
博客等级 码龄11年 5638粉丝 1383原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值