每次要查看内容时创建的视图加载

时间:2015-04-28 13:04:10

标签: mysql sql sequelpro

我遇到了一个奇怪的情况,每当我想看到生成的表视图的内容时,它就会开始加载数据,而不是立即显示数据。

当我使用此查询时,数据将立即显示:

CREATE VIEW train_set
AS SELECT *
FROM logs where ((logs.timestamp >= '2014-03-01 00:00:00') and (logs.timestamp < '2014-03-16 00:00:00'));

但是当我使用这个查询时:

CREATE VIEW train_set
AS SELECT *
FROM logs where ((logs.timestamp >= '2014-03-01 00:00:00') and (logs.timestamp < '2014-03-16 00:00:00') and logs.user_id = '10');

每次我想查看表视图的内容:train_set它开始加载,就像它实际上再次执行查询一样。

现在有人为什么会这样?我在Macbook上使用Sequel Pro

2 个答案:

答案 0 :(得分:2)

每次打开视图时都会执行查询。这就是观点。要获得表格和要抓取的结果之间的中间步骤。或者快速查看数据库中的相关数据(如每日条目)。

我唯一的解释是,您的第一个查询速度更快,因此无法加载。但实际上,两者都会在每次出现时都被执行。

我无法想象为什么有人会想要创建一个只执行一次(创建时)的视图。另外,你可以将你的东西导出到excel文件。不一样吗?

答案 1 :(得分:0)

嗯,一般视图会在select上刷新。它们不会立即刷新,因为它们会在&#34;已查看&#34;中获取所有新行激活触发器时的表格(选择或其他任何内容)。

让我们开始使用另一个帮助的概念,&#34;物化视图&#34;。默认情况下,Mysql无需手动操作即可使用此功能。

首先,物化视图是一个&#34;存储的视图&#34; (从技术上讲,它不是,但为了解释,它是)。那么,你需要做什么?

创建一个名为&#34; train_set_mv&#34;,

的新表
CREATE TABLE TRAIN_SET_MV AS SELECT * FROM LOGS 

(一种制作图像的简单方法,为性能创建所有索引,因为它关于日志)

现在在INSERT,DELETE,UPDATE等之后在基表中创建一个触发器,如下所示:

DELIMITER |
CREATE TRIGGER trig_logs AFTER INSERT ON logs
   FOR EACH ROW BEGIN
      INSERT INTO train_set_mv
         SELECT fields
         FROM logs log WHERE LOG.ID = NEW.ID; 
   END;

您会看到,视图只是每次触发触发器时刷新的图像。每次日志更改时都需要将其放入表中。 请记住,您需要包含您的用户&#39; ID,时间戳或您想要的任何其他内容。