我遇到了一个奇怪的情况,每当我想看到生成的表视图的内容时,它就会开始加载数据,而不是立即显示数据。
当我使用此查询时,数据将立即显示:
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
答案 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,时间戳或您想要的任何其他内容。