深入了解MySQL ClickHouse中的物化視圖功能
目錄
- 數據表與視圖
- ClickHouse的物化視圖
- 物化視圖的更新
- 使用示例
數據表與視圖
- 數據庫表是一種關系型數據庫中的基本對象,用于存儲數據。每個表包含多個列和行,其中每個列代表一種數據類型,每一行則表示一條記錄
- 視圖是一種虛擬的表格,它并不實際存在于數據庫中,而是通過一個
SQL
查詢語句定義。視圖在數據庫管理中具有重要作用,在實踐中也是非常常見的。 - 視圖可以從一個或多個表中選擇部分列或行作為數據顯示,并提供了訪問數據的一種靈活方式
- 與表格不同的是,視圖不能存儲數據,但對于一些常用的查詢操作,卻能大大簡化
SQL
操作 - 通過創建視圖,可以大大簡化復雜的查詢,同時也可以保持數據獨立性,提高數據的安全性
- 視圖可以為數據提供安全保護,限制用戶對特定數據的訪問權限。例如,你的系統要和另一個系統對接,對方要求訪問某些數據,又不想搞接口對接;此時就可以根據對方的需要,建幾個視圖,再給對方開個只讀這幾個視圖的低權限用戶;這樣既滿足對方查詢需求,又不會被對方讀取或修改到其他數據。
ClickHouse的物化視圖
- 像上面說的,視圖并不存儲任何數據,而是通過查詢操作動態生成數據。它可以幫助用戶在數據表上創建一層抽象,獲得一些更加方便和易于維護的業務邏輯
ClickHouse
是一個快速的列式數據庫管理系統,ClickHouse
的視圖也是一種虛擬的表,其內容由一個查詢定義ClickHouse
的普通視圖(view
),和其他數據庫一樣,沒有緩存數據,每次查詢都需要重新生成數據- 但是
ClickHouse
還支持一種物化視圖(Materialized View
),字面意義理解,就是實際去物理存儲視圖 - 物化視圖是一種特殊的視圖,它會在創建的時候自動執行查詢,并將結果保存到一張實際的表格中。在查詢物化視圖時,可以直接使用保存的結果進行查詢,而無需重新執行查詢語句,從而顯著提高查詢效率
- 簡單來說,就是“空間換時間”,提前查詢好存儲起來,占用了一定的空間,當查詢時直接拿來使用,因此在使用時需要權衡查詢效率與存儲空間的使用。
物化視圖的更新
ClickHouse的物化視圖(Materialized View
)是一種特殊的表,它能夠在底層數據更新后,自動更新自己的數據。數據更新包括兩個方面的變化:基礎表的數據修改和基礎表的數據新增。
基礎表的數據修改
如果基礎表的數據修改,物化視圖會自動更新。這是通過ClickHouse
的引擎和存儲方式來實現的。當基礎表的一行記錄被修改,ClickHouse
會將這個修改轉化為一個新的INSERT
語句,并且將其發送到物化視圖中。這樣,物化視圖就能夠自動更新自己的數據。
基礎表的數據新增
如果基礎表的數據新增,物化視圖同樣會自動更新。這是通過設置物化視圖的刷新機制來實現的。刷新機制有兩種類型:定時刷新和自動刷新。
(1)定時刷新
定時刷新需要使用MATERIALIZED VIEW
的REFRESH INTERVAL
語法來指定刷新時間間隔。例如,以下語句表示每5分鐘自動刷新物化視圖:
CREATE MATERIALIZED VIEW my_mv engine = MergeTree AS SELECT * FROM my_table SETTINGS refresh_interval = 300
(2)自動刷新
自動刷新可以通過在基礎表上創建觸發器實現。當基礎表有數據插入時,觸發器會自動插入相應的數據到物化視圖中。例如,以下語句創建了一個觸發器,當my_table
中插入一條新數據時,相應的數據將插入到my_mv
中:
CREATE TRIGGER insert_trigger ON my_table FOR INSERT AS INSERT INTO my_mv SELECT * FROM my_table WHERE id = NEW.id
另外,我們也可以手動刷新物化視圖,甚至可以使用一些定時手段,實時或定時去觸發它。當然,我們要考慮資源占用和性能損耗。
REFRESH MATERIALIZED VIEW xxx;
需要注意的是,ClickHouse
的物化視圖雖然能夠自動更新數據,但是會帶來一些性能上的損失,尤其是在基礎表數據量較大的情況下。因此,在設計物化視圖時,需要考慮這個因素,同時選擇合適的刷新機制來平衡性能和數據實時性的需求。
當然,我們既然選擇使用ClickHouse
,肯定是數據新增比較多,而極少去修改刪除。對于一般對實時要求不高的業務場景,定時刷新完全足夠我們使用了。
使用示例
在ClickHouse
中,創建視圖的語法為:
CREATE VIEW [IF NOT EXISTS] name [ON CLUSTER cluster] ( SELECT ... )
其中,name
為視圖的名稱,SELECT
語句為需要執行的查詢語句。創建視圖之后,可以使用SELECT
語句查詢視圖的內容。
- 在
ClickHouse
中,創建物化視圖的語法為:
CREATE MATERIALIZED VIEW [IF NOT EXISTS] name [ON CLUSTER cluster] TO [db.]table [ENGINE = engine] [POPULATE] AS SELECT ...
其中,name
為物化視圖的名稱,[db.]table
為保存結果的表格名稱,SELECT
語句為需要執行的查詢語句。在創建物化視圖時,可以選擇是否執行第一次查詢,并將結果保存到表格中。后續查詢時,可以直接使用表格中保存的結果進行查詢,從而提高查詢效率。
- 像一些其他參數,例如
PARTITION BY
、ORDER BY
等也可以在創建物化視圖時使用,和創建表的使用方法一樣,也可以創建完物化視圖后再去更新設置 - 下面給出一個普通物化視圖的完整示例。假設我們有一個表名為
example
,并且我們想創建一個名為example_mv
的物化視圖,refresh_interval
設置為5分鐘,以便定時更新數據。以下是創建該視圖的示例SQL
語句:
CREATE MATERIALIZED VIEW example_mv ENGINE = MergeTree() AS SELECT Column1, Column2, ... FROM example -- 設置刷新間隔為5分鐘 SETTINGS refresh_interval = 300
到此這篇關于深入了解MySQL ClickHouse中的物化視圖功能的文章就介紹到這了,更多相關MySQL ClickHouse物化視圖內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!
