物化视图是相对于视图而言的,但是两者实际上并没有什么关系就如java/javaScript一样
首先mysql的视图不是一种物化视图,他相当于一个虚拟表,本身并不存储数据,当sql在操作视图时所有数据都是从其他表中查询出来的。者带来的问题是使用视图并不能将常用数据分离出来,优化查询速度,切操作视图的很多命令和普通标一样,这回导致在业务中无法通过sql区分表和视图,使代码变得复杂。
视图是简化设计,清晰编码的东西,他并不是提高性能的,他的存在只会降低性能(如一个视图7个表关联,另一个视图8个表,程序员不知道,觉得很方便,把两个视图关联再做一个视图,那就惨了),他的存在未了在设计上的方便性
物化视图可以帮助加快严重依赖某些聚合结果的查询。
如果插入速度不是问题,则此功能可以帮助减少系统上的读取负载。
使用场景
在我们的user_order表中有800万的数据,这是时候如果需要使用聚合来查询数据,那么就会很慢,下图就可以看到,查询这些数据花费了4秒钟时间,这在项目中是很不允许的
解决方案
其实就是在新建一张表,把查出来的数据存放在那个表里边即可。当然这里也可以使用缓存来操作。
创建存储聚合查询出来的数据
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;
-- 定义存储过程来定时执行更新数据 CREATE PROCEDURE refresh_mv_now () BEGIN -- 清空表里边的数据 TRUNCATE TABLE record_data; -- 更新记录表里边的聚合查询数据 insert into record_data select * from record_view; END; call refresh_mv_now ();