每次我想查看内容时都会加载创建的视图
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、时间戳或任何其他您想要的内容。
我遇到了一个奇怪的情况,每次我想查看生成的 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"、
的新 tableCREATE 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、时间戳或任何其他您想要的内容。