【MySQL】物化视图

【MySQL】物化视图,第1张

概述物化视图是相对于视图而言的,但是两者实际上并没有什么关系就如java/javaScript一样首先mysql的视图不是一种物化视图,他相当于一个虚拟表,本身并不存储数据,当sql在 *** 作视图时所有数据都是从其他表中查询出来的。者带来的问题是使用视图并不能将常用数据分离出来,优化查询速度,切 *** 作视图的很多命令和普通标一样,这回导致在业务中无法通过sql区分表和视图,使代码变得复杂。视图是简化设计,...

物化视图是相对于视图而言的,但是两者实际上并没有什么关系就如java/JavaScript一样

首先MysqL的视图不是一种物化视图,他相当于一个虚拟表,本身并不存储数据,当@R_419_6983@在 *** 作视图时所有数据都是从其他表中查询出来的。者带来的问题是使用视图并不能将常用数据分离出来,优化查询速度,切 *** 作视图的很多命令和普通标一样,这回导致在业务中无法通过@R_419_6983@区分表和视图,使代码变得复杂。

视图是简化设计,清晰编码的东西,他并不是提高性能的,他的存在只会降低性能(如一个视图7个表关联,另一个视图8个表,程序员不知道,觉得很方便,把两个视图关联再做一个视图,那就惨了),他的存在未了在设计上的方便性

物化视图可以帮助加快严重依赖某些聚合结果的查询。

如果插入速度不是问题,则此功能可以帮助减少系统上的读取负载。

使用场景

在我们的user_order表中有800万的数据,这是时候如果需要使用聚合来查询数据,那么就会很慢,下图就可以看到,查询这些数据花费了4秒钟时间,这在项目中是很不允许的

解决方案

其实就是在新建一张表,把查出来的数据存放在那个表里边即可。当然这里也可以使用缓存来 *** 作。

创建存储聚合查询出来的数据
CREATE table record_data(	name VARCHAR(60)  NOT NulL ,	count INT NOT NulL,	price_sum INT  NOT NulL,	price_avg float NOT NulL,	num_sum INT  NOT NulL,	num_avg float NOT NulL,  UNIQUE INDEX name (name));

在创建一个user_order的一个视图表,防止以后表结构的改动

切记这里的视图时在源数据的视图,不是存储聚合查询的那个表的视图

create vIEw record_vIEw as	select			name,      count(*) count,			sum(price_sum) price_sum,			avg(price_avg) price_avg,			sum(num_sum) num_sum,			avg(num_avg) num_avg	from			record_data	group by			name;			

将聚合查询的数据存放到record_data中
insert into record_data select `name`,count(*),sum(price),sum(num),avg(price),avg(num) from user_order;

然后就可以看到我们用来专门存储聚合查询的数据表里边的数据


同样也可以使用咱们刚刚定义好的视图来获取数据

insert into record_data select * from record_vIEw;

定时更新

定时调用refresh_mv_Now即可更新record_data的数据

-- 定义存储过程来定时执行更新数据CREATE PROCEDURE refresh_mv_Now ()BEGIN	-- 清空表里边的数据  TruncATE table record_data;  -- 更新记录表里边的聚合查询数据  insert into record_data select * from record_vIEw;END;call refresh_mv_Now ();
时时更新

实时更新数据,==>> 触发器 使用触发器,是很会影响数据库的写 *** 作的性能
这个没有进行测试其实就是利用触发器,进行时时的更新record_data的数据,原理明白就可以了

CREATE TRIGGER purchase_mv_trigger_ins AFTER INSERT ON purchase_order FOR EACH ROWBEGIN	SET @old_pro_price_sum = 0;	SET @old_pro_price_avg = 0;	SET @old_pro_num_sum = 0;	SET @old_pro_num_avg = 0;	SET @old_pro_count = 0;	# 查询出之前的信息然后记录到不同的变量中	SELECT		IFNulL(pro_price_sum,0),IFNulL(pro_price_avg,		IFNulL(pro_num_sum,IFNulL(pro_num_avg,		IFNulL(pro_count,0)	FROM		purchase_mv	WHERE		supply_name = NEW.supply_name	INTO		@old_pro_price_sum,@old_pro_price_avg,@old_pro_num_sum,@old_pro_num_avg,@old_pro_count;	# 然后再去计算更新 *** 作之后的内容	SET @new_pro_count = @old_pro_count + 1;	SET @new_pro_price_sum = @old_pro_price_sum + NEW.pro_price;	SET @new_pro_price_avg = @new_pro_price_sum / @new_pro_count;	SET @new_pro_num_sum = @old_pro_num_sum + NEW.pro_num;	SET @new_pro_num_avg = @new_pro_num_sum / @new_pro_count;	REPLACE INTO		purchase_mv	VALUES(		NEW.supply_name, @new_pro_count,		@new_pro_price_sum, IFNulL(@new_pro_price_avg, 0),		@new_pro_num_sum, IFNulL(@new_pro_num_avg, 0)	);END;
应用范围

物化视图 -> 存储过程 和 触发器的 综合应用
表的数据大 : 有些内容很频繁查询

查看

https://www.yuque.com/u30882/rx39g7/dzztm0

总结

以上是内存溢出为你收集整理的【MySQL】物化视图全部内容,希望文章能够帮你解决【MySQL】物化视图所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1151677.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存