2015-04-28 73 views
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'); 

每次我想看看錶視圖的內容:train_set它開始加載就像它實際上再次執行查詢。

現在有人問爲什麼這是嗎?我在我的Macbook上使用Sequel Pro

回答

2

它每次打開視圖時都會執行您的查詢。這是觀點。爲了在你的表格和你想要抓取的結果之間找到一箇中間步驟。或者快速查看相關數據的數據庫(如每日條目)。

對我來說唯一的解釋是你的第一個查詢更快,所以你看不到它加載。但實際上,每一場演出都會被執行。

我無法想象爲什麼有人想創建一個只執行一次的視圖(創建時)。替代地,你可以將你的東西導出到excel文件中。那會是一樣的嗎?

+1

是的,這是一個很好的我只是出口到Excel文件!數據庫內的數據不會改變,我只需要檢索一次。感謝您的解釋。 – Rotan075

+0

當然。很高興我能幫上忙。 :) – C4u

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,時間戳或您想要的任何其他內容。