每次我想查看内容时都会加载创建的视图

Created view loads every time I want to see the contents

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

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

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 视图的内容时:train_set 它开始加载,就像它实际上再次执行查询一样。

现在有人知道这是为什么吗?我在我的 Macbook

上使用 Sequel Pro

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

对我来说唯一的解释是您的第一个查询速度更快,所以您看不到它正在加载。但事实上,每次出现都被执行。

我无法想象为什么有人想要创建一个只执行一次(创建时)的视图。或者,您可以将您的内容导出到 excel 文件。不一样吗?

嗯,通常 浏览量 会在 select 上刷新。它们不会立即刷新,因为当您激活触发器(select 或其他任何东西)时,它们会获取 "viewed" table 中的所有 新行 。 =12=]

让我们从另一个有帮助的概念开始,"Materialized Views"。 Mysql 默认情况下,如果不进行一些手动操作,则无法使用此功能。

首先,实体化视图是 "stored view"(从技术上讲不是,但为了便于解释,它是)。那么,你需要做什么?

创建一个名为 "train_set_mv"、

的新 table
CREATE TABLE TRAIN_SET_MV AS SELECT * FROM LOGS 

(一个简单的做图的方法,因为是关于log的,所有的索引都是为了性能)

现在,在插入、删除、更新等操作后,在您的基础 table 中创建一个触发器,如下所示:

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;

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