物化视图,它是用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,从而快速的得到结果。物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能;物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL 语句的正确性和有效性;物化视图需要占用存储空间;当基表发生变化时,物化视图也应当刷新

创建自己的物化视图

DROP TABLE sales_mv;
CREATE TABLE sales_mv (
product_name VARCHAR(128) NOT NULL
, price_sum DECIMAL(10,2) NOT NULL
, amount_sum INT NOT NULL
, price_avg FLOAT NOT NULL
, amount_avg FLOAT NOT NULL
, sales_cnt INT NOT NULL
, UNIQUE INDEX product (product_name)
); INSERT INTO sales_mv
SELECT product_name
, SUM(product_price), SUM(product_amount)
, AVG(product_price), AVG(product_amount)
, COUNT(*)
FROM sales
GROUP BY product_name;

当有需要时对物化视图进行刷新,存储过程如下

DROP PROCEDURE refresh_mv_now;

DELIMITER $$

CREATE PROCEDURE refresh_mv_now (
OUT rc INT
)
BEGIN TRUNCATE TABLE sales_mv; INSERT INTO sales_mv
SELECT product_name
, SUM(product_price), SUM(product_amount)
, AVG(product_price), AVG(product_amount)
, COUNT(*)
FROM sales
GROUP BY product_name; SET rc = 0;
END;
$$ DELIMITER ;

立刻刷新物化视图,当执行insert,delete和update时

创建相关触发器

DELIMITER $$

CREATE TRIGGER sales_ins
AFTER INSERT ON sales
FOR EACH ROW
BEGIN SET @old_price_sum = 0;
SET @old_amount_sum = 0;
SET @old_price_avg = 0;
SET @old_amount_avg = 0;
SET @old_sales_cnt = 0; SELECT IFNULL(price_sum, 0), IFNULL(amount_sum, 0), IFNULL(price_avg, 0)
, IFNULL(amount_avg, 0), IFNULL(sales_cnt, 0)
FROM sales_mv
WHERE product_name = NEW.product_name
INTO @old_price_sum, @old_amount_sum, @old_price_avg
, @old_amount_avg, @old_sales_cnt
; SET @new_price_sum = @old_price_sum + NEW.product_price;
SET @new_amount_sum = @old_amount_sum + NEW.product_amount;
SET @new_sales_cnt = @old_sales_cnt + 1;
SET @new_price_avg = @new_price_sum / @new_sales_cnt;
SET @new_amount_avg = @new_amount_sum / @new_sales_cnt; REPLACE INTO sales_mv
VALUES(NEW.product_name, @new_price_sum, @new_amount_sum, @new_price_avg
, @new_amount_avg, @new_sales_cnt)
; END;
$$ DELIMITER ;
DELIMITER $$

CREATE TRIGGER sales_del
AFTER DELETE ON sales
FOR EACH ROW
BEGIN SET @old_price_sum = 0;
SET @old_amount_sum = 0;
SET @old_price_avg = 0;
SET @old_amount_avg = 0;
SET @old_sales_cnt = 0; SELECT IFNULL(price_sum, 0), IFNULL(amount_sum, 0), IFNULL(price_avg, 0)
, IFNULL(amount_avg, 0), IFNULL(sales_cnt, 0)
FROM sales_mv
WHERE product_name = OLD.product_name
INTO @old_price_sum, @old_amount_sum, @old_price_avg
, @old_amount_avg, @old_sales_cnt
; SET @new_price_sum = @old_price_sum - OLD.product_price;
SET @new_amount_sum = @old_amount_sum - OLD.product_amount;
SET @new_price_avg = @new_price_sum / @new_amount_sum;
SET @new_sales_cnt = @old_sales_cnt - 1;
SET @new_amount_avg = @new_amount_sum / @new_sales_cnt; REPLACE INTO sales_mv
VALUES(OLD.product_name, @new_price_sum, @new_amount_sum
, IFNULL(@new_price_avg, 0), IFNULL(@new_amount_avg, 0)
, @new_sales_cnt)
; END;
$$ DELIMITER ;
DELIMITER $$

CREATE TRIGGER sales_upd
AFTER UPDATE ON sales
FOR EACH ROW
BEGIN SET @old_price_sum = 0;
SET @old_amount_sum = 0;
SET @old_price_avg = 0;
SET @old_amount_avg = 0;
SET @old_sales_cnt = 0; SELECT IFNULL(price_sum, 0), IFNULL(amount_sum, 0), IFNULL(price_avg, 0)
, IFNULL(amount_avg, 0), IFNULL(sales_cnt, 0)
FROM sales_mv
WHERE product_name = OLD.product_name
INTO @old_price_sum, @old_amount_sum, @old_price_avg
, @old_amount_avg, @old_sales_cnt
; SET @new_price_sum = @old_price_sum + (NEW.product_price - OLD.product_price);
SET @new_amount_sum = @old_amount_sum + (NEW.product_amount
- OLD.product_amount);
SET @new_sales_cnt = @old_sales_cnt;
SET @new_price_avg = @new_price_sum / @new_sales_count;
SET @new_amount_avg = @new_amount_sum / @new_sales_cnt; REPLACE INTO sales_mv
VALUES(OLD.product_name, @new_price_sum, @new_amount_sum
, IFNULL(@new_price_avg, 0), IFNULL(@new_amount_avg, 0)
, @new_sales_cnt)
; END;
$$ DELIMITER ;

参考:http://www.fromdual.com/mysql-materialized-views#implement

使用mysql创建自己的物化视图的更多相关文章

  1. oracle 物化视图及创建索引

    物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询.这样对整体 ...

  2. Oracle之物化视图

    来源于:http://www.cnblogs.com/Ronger/archive/2012/03/28/2420962.html 近期根据项目业务需要对oracle的物化视图有所接触,在网上搜寻关于 ...

  3. 《oracle每天一练》Oracle之物化视图

    相关帖子思考和跟踪 本文转自Ronger 物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实 ...

  4. oracle物化视图

    物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询. 这样对整 ...

  5. 【转】Oracle之物化视图

    原文地址:http://www.cnblogs.com/Ronger/archive/2012/03/28/2420962.html 物化视图是一种特殊的物理表,“物化”(Materialized)视 ...

  6. .Net程序员学用Oracle系列(23):视图理论、物化视图

    1.视图理论 1.1.视图的存储 1.2.视图的作用 1.3.视图的工作机制 1.4.视图的依赖性 1.5.可更新的连接视图 1.6.内联视图 2.物化视图 2.1.刷新物化视图 2.2.物化视图日志 ...

  7. Oracle普通视图和物化视图的区别

    介绍 物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询, Oracle 都实际上转换为视图SQL语句的查询. ...

  8. ORACLE物化视图(物理视图)

    百度文库 http://wenku.baidu.com/view/f78f55c68bd63186bcebbc4b.html ORACLE物化视图 一.------------------------ ...

  9. ORACLE物化视图具体解释

    一.物化的一般使用方法物化视图是一种特殊的物理表,"物化"(Materialized)视图是相对普通视图而言的.普通视图是虚拟表.应用的局限性大,不论什么对视图的查询.oracle ...

随机推荐

  1. 致 Python 初学者们!

    ​ 前言 在 Python 进阶的过程中,相信很多同学应该大致上学习了很多 Python 的基础知识,也正在努力成长.在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫.我非常理解你们所面临的处 ...

  2. uniapp结合小程序第三方插件“WechatSI”实现语音识别功能,进而实现终端控制

    最近在用soket实现终端控制器的功能,然后就想用语音控制,这样显得更AI WechatSI在manifest.json中配置: 在vue中插入如下展示代码: <view class=" ...

  3. MCMC学习

    看了这个文档 结合随机矩阵的知识, 更清楚了一点. https://www.cnblogs.com/xbinworld/p/4266146.html

  4. 898A. Rounding#数的舍入

    题目出处:http://codeforces.com/problemset/problem/898/A 题目大意:找一个数最近的整十的数 #include<iostream> using ...

  5. Linux_打包文件

    将多个文件打包成一个大文件,用tar命令 tar是将多个文件前后连接在一起,tar并不对文件进行压缩 tar -cf  要创建的打包文件名(最后加上.tar)  要打包的文件/列表      c代表创 ...

  6. 2. Unconstrained Optimization(2th)

    2.1 Basic Results on the Existence of Optimizers 2.1. DefinitionLet $f:U->\mathbb{R}$ be a functi ...

  7. python-django项目-Linux系统建立django项目_20191117

    python-django项目-Linux系统建立django项目 1,Linux系统下面,cd /usr/local/lib/  看这个下面会有两个python版本,一个2.7,一个3.5,我们使用 ...

  8. JS如何按时间粒度获取date的时间差

    获取date类型 var type = _xAxis[0].split(/-|:|\s/).length; 按时间粒度获取date的时间差 function getDateDiffByType(new ...

  9. 使用ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标的转换

    [摘 要] 本文针对从事测绘工作者普遍遇到的坐标转换问题,简要介绍ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标转换原理和步骤. [关键词] ArcGIS 坐标转换 投影变换 1 坐标转换 ...

  10. jQuery选择器的效率问题

    jQuery提供了功能强大,并兼容多种css版本的选择器,不过发现很多同学在使用选择器时并未注重效率的问题. a) 尽量使用Id选择器,jQuery选择器使用的API都是基于getElementByI ...