0

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

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

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');

每次我想查看 Table View: train_set 的内容时,它都会开始加载,就像它实际上再次执行查询一样。

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

4

2 回答 2

2

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

对我来说唯一的解释是您的第一个查询更快,因此您看不到它正在加载。但事实上,两者都在每次出现时都被处决。

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

于 2015-04-28T13:23:42.840 回答
0

好吧,通常视图会在选择时刷新。它们不会立即刷新,因为当您激活触发器(选择或其他任何内容)时,它们会获取“已查看”表中的所有新行。

让我们从另一个有用的概念开始,“物化视图”。默认情况下,如果没有一些手动工作,Mysql 无法使用此功能。

首先,物化视图是“存储视图”(从技术上讲不是,但为了解释起见,它是)。那么,你需要做什么呢?

创建一个名为“train_set_mv”的新表,

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;

您会看到,视图只是每次扣动扳机时都会刷新的图像。每次日志更改时,您都需要将其放入表中。请记住,您需要包含您的用户 ID、时间戳或您想要的任何其他内容。

于 2015-04-28T13:38:51.397 回答