表引擎
表引擎(即表的類型)決定了:
- 數據的存儲方式和位置,寫到哪里以及從哪里讀取數據。
- 支持哪些查詢以及如何支持。
- 并發數據訪問。
- 索引的使用(如果存在)。
- 是否可以執行多線程請求。
- 數據復制參數。
引擎類型
MergeTree
MergeTree是云數據庫ClickHouse的主要存儲引擎,按主鍵排序存儲數據,支持索引、分區和復制,提供高速寫入和實時分析查詢。
該類型的引擎:
- MergeTree
- ReplacingMergeTree
- SummingMergeTree
- AggregatingMergeTree
- CollapsingMergeTree
- VersionedCollapsingMergeTree
- GraphiteMergeTree
日志
輕量級的小數據量存儲,按插入順序存儲數據,無序,超高速寫入,但沒有索引。
該類型的引擎:
- TinyLog
- StripeLog
- Log
集成引擎
用于與其他的數據存儲與處理系統集成的引擎。 該類型的引擎:
- Kafka
- MySQL
- ODBC
- JDBC
- HDFS
用于其他特定功能的引擎
該類型的引擎:
- Distributed
- MaterializedView
- Dictionary
- Merge
- File
- Null
- Set
- Join
- URL
- View
- Memory
- Buffer
虛擬列
虛擬列是表引擎組成的一部分,它在對應的表引擎的源代碼中定義。
您不能在 CREATE TABLE 中指定虛擬列,并且虛擬列不會包含在 SHOW CREATE TABLE 和 DESCRIBE TABLE 的查詢結果中。虛擬列是只讀的,所以您不能向虛擬列中寫入數據。
如果想要查詢虛擬列中的數據,您必須在SELECT查詢中包含虛擬列的名字。SELECT * 不會返回虛擬列的內容。
若您創建的表中有一列與虛擬列的名字相同,那么虛擬列將不能再被訪問。我們不建議您這樣做。為了避免這種列名的沖突,虛擬列的名字一般都以下劃線開頭。
合并樹引擎示例
MergeTree
MergeTree引擎是云數據庫ClickHouse的默認存儲引擎,它適用于有序數據的快速插入和查詢。MergeTree引擎以主鍵的方式組織數據,并支持按照主鍵范圍進行數據分區和排序。這種組織方式使得MergeTree引擎在處理大量數據和快速查詢時表現出色。
MergeTree引擎的主要特點和功能包括:
- 數據分區:MergeTree引擎將數據按照主鍵范圍進行分區,每個分區都包含一個或多個數據塊,以支持更高效的數據查詢和壓縮。
- 數據排序:數據在每個分區內按照主鍵進行排序,使得查詢時可以利用主鍵范圍進行快速定位和過濾。
- 索引:MergeTree引擎自動為主鍵創建索引,加速查詢操作。
- 數據合并:當數據插入到MergeTree表時,如果與已有數據有重疊的主鍵范圍,引擎會自動進行數據合并,保證數據的有序性和唯一性。
- 數據壓縮:MergeTree引擎支持多種數據壓縮算法,可以有效減少數據占用的磁盤空間,提高存儲效率。
下面是一個使用MergeTree引擎創建表的示例:
CREATE TABLE my_table
(
date Date,
id Int32,
value Float64
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
在上述示例中,我們創建了一個名為my_table的表,它包含了日期(date)、ID(id)和值(value)三個列。使用MergeTree引擎,我們將數據按照日期進行分區(每個月一份數據),并按照日期和ID進行排序。這樣可以加速按照日期范圍和ID進行查詢操作。
MergeTree引擎在數據查詢和存儲方面具有高效性和靈活性,適用于大數據量的分析和查詢場景。
ReplacingMergeTree
ReplacingMergeTree引擎是云數據庫ClickHouse的一種存儲引擎,它是基于MergeTree引擎的一種變體。ReplacingMergeTree引擎用于處理帶有版本控制的數據,允許在插入新數據時自動替換舊數據。這種引擎適用于需要保留最新數據版本并且可以刪除舊數據的場景。
ReplacingMergeTree引擎的主要特點和功能包括:
- 版本控制:每條數據都帶有版本信息,新插入的數據會替換舊版本的數據。
- 數據排序:數據按照主鍵范圍進行排序,以支持快速查詢和按照主鍵范圍刪除舊數據。
- 索引:引擎會為主鍵創建索引,提高查詢和刪除操作的效率。
- 數據合并:當新數據插入時,舊數據根據版本控制規則進行替換,保留最新的數據版本。
- 數據壓縮:支持多種數據壓縮算法,減少數據占用的磁盤空間。
下面是一個使用ReplacingMergeTree引擎創建表的示例:
CREATE TABLE my_table
(
date Date,
id Int32,
value Float64,
version UInt32
)
ENGINE = ReplacingMergeTree(version)
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
在上述示例中,我們創建了一個名為my_table的表,它包含了日期(date)、ID(id)、值(value)和版本(version)四個列。使用ReplacingMergeTree引擎,我們按照版本控制規則對數據進行插入和替換操作。表的數據按照日期進行分區(每個月一份數據),并按照日期和ID進行排序。
ReplacingMergeTree引擎適用于需要保留最新數據版本并進行版本控制的場景,例如日志記錄、事件追蹤等應用。它提供了方便的數據替換和刪除功能,使得數據的更新和維護更加靈活和高效。
CollapsingMergeTree
CollapsingMergeTree引擎是云數據庫ClickHouse的一種存儲引擎,它是基于MergeTree引擎的一種變體。CollapsingMergeTree引擎用于處理具有相同主鍵值的數據,并將它們合并為一行。這種引擎適用于需要對數據進行聚合和壓縮的場景。
CollapsingMergeTree引擎的主要特點和功能包括:
- 主鍵合并:具有相同主鍵值的行將被合并為一行,減少數據冗余和存儲空間。
- 數據排序:數據按照主鍵范圍進行排序,以支持快速查詢和按照主鍵范圍刪除數據。
- 聚合函數:可以對合并后的行應用聚合函數,如SUM、MAX、MIN等,以獲取合并后的結果。
- 索引:引擎會為主鍵創建索引,提高查詢和刪除操作的效率。
- 數據壓縮:支持多種數據壓縮算法,減少數據占用的磁盤空間。
下面是一個使用CollapsingMergeTree引擎創建表的示例:
CREATE TABLE my_table
(
date Date,
id Int32,
value Float64,
flag Int8
)
ENGINE = CollapsingMergeTree(flag)
ORDER BY (date, id)
在上述示例中,我們創建了一個名為my_table的表,它包含了日期(date)、ID(id)、值(value)和標志(flag)四個列。使用CollapsingMergeTree引擎,并根據標志(flag)進行主鍵合并。表的數據按照日期和ID進行排序。
CollapsingMergeTree引擎適用于需要對具有相同主鍵值的數據進行合并和聚合的場景,例如事件統計、日志分析等應用。它能夠減少數據冗余,提高查詢效率,并支持各種聚合操作,為數據分析提供便利。
VersionedCollapsingMergeTree
VersionedCollapsingMergeTree引擎是云數據庫ClickHouse的一種存儲引擎,它是基于CollapsingMergeTree引擎的一種變體。VersionedCollapsingMergeTree引擎適用于需要對數據進行合并和聚合,并且需要保留歷史版本的場景。
VersionedCollapsingMergeTree引擎的主要特點和功能包括:
- 主鍵合并:具有相同主鍵值的行將被合并為一行,減少數據冗余和存儲空間。
- 數據排序:數據按照主鍵范圍進行排序,以支持快速查詢和按照主鍵范圍刪除數據。
- 聚合函數:可以對合并后的行應用聚合函數,如SUM、MAX、MIN等,以獲取合并后的結果。
- 歷史版本:VersionedCollapsingMergeTree引擎會保留歷史版本的數據,可以按照版本進行查詢和回溯。
- 索引:引擎會為主鍵創建索引,提高查詢和刪除操作的效率。
下面是一個使用VersionedCollapsingMergeTree引擎創建表的示例:
CREATE TABLE my_table
(
date Date,
id Int32,
value Float64,
flag Int8,
version UInt32
)
ENGINE = VersionedCollapsingMergeTree(8192, version)
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
在上述示例中,我們創建了一個名為my_table的表,它包含了日期(date)、ID(id)、值(value)、標志(flag)和版本(version)五個列。使用VersionedCollapsingMergeTree引擎,并根據版本(version)進行主鍵合并。表的數據按照日期和ID進行排序,并按照年月進行分區。
VersionedCollapsingMergeTree引擎適用于需要對具有相同主鍵值的數據進行合并和聚合,并且需要保留歷史版本的場景,例如審計日志、數據變更記錄等應用。它能夠減少數據冗余,提供數據的歷史版本查詢和回溯功能,為數據分析和數據溯源提供便利。
AggregatingMergeTree
AggregatingMergeTree引擎是云數據庫ClickHouse的一種存儲引擎,用于對數據進行聚合操作和存儲聚合結果。它適用于需要高效地進行聚合查詢的場景,如數據分析、報表生成等。
AggregatingMergeTree引擎的主要特點和功能包括:
- 聚合操作:引擎會按照指定的聚合鍵對數據進行分組和聚合操作,例如SUM、MAX、MIN等。
- 存儲聚合結果:引擎會存儲聚合后的結果,而不是原始的細粒度數據,減少存儲空間和提高查詢性能。
- 數據排序:數據按照聚合鍵進行排序,以支持快速的聚合查詢。
- 索引:引擎會為聚合鍵創建索引,提高聚合查詢的效率。
下面是一個使用AggregatingMergeTree引擎創建表的示例:
CREATE TABLE my_table
(
date Date,
category String,
value Float64
)
ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, category)
SETTINGS index_granularity = 8192
在上述示例中,我們創建了一個名為my_table的表,它包含了日期(date)、分類(category)和值(value)三個列。使用AggregatingMergeTree引擎,并根據日期和分類進行數據的聚合和排序。表的數據按照年月進行分區,并設置了索引的粒度為8192。
通過使用AggregatingMergeTree引擎,您可以將細粒度的數據進行聚合,并存儲聚合結果,以提高查詢性能和減少存儲空間。這對于需要頻繁進行聚合查詢的場景非常有用,可以加快查詢速度并節省存儲成本。
SummingMergeTree
SummingMergeTree引擎是云數據庫ClickHouse中的一種存儲引擎,用于對數據進行聚合操作并存儲聚合結果。它適用于需要對某些列進行求和聚合的場景,例如統計總和、平均值等。
SummingMergeTree引擎的主要特點和功能包括:
- 聚合操作:引擎會按照指定的聚合鍵對數據進行分組和聚合操作,例如對某列進行求和操作。
- 存儲聚合結果:引擎會存儲聚合后的結果,而不是原始的細粒度數據,減少存儲空間和提高查詢性能。
- 數據排序:數據按照聚合鍵進行排序,以支持快速的聚合查詢。
- 索引:引擎會為聚合鍵創建索引,提高聚合查詢的效率。
下面是一個使用SummingMergeTree引擎創建表的示例:
CREATE TABLE my_table
(
date Date,
category String,
value Float64
)
ENGINE = SummingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, category)
SETTINGS index_granularity = 8192
在上述示例中,我們創建了一個名為my_table的表,它包含了日期(date)、分類(category)和值(value)三個列。使用SummingMergeTree引擎,并根據日期和分類進行數據的聚合和排序。表的數據按照年月進行分區,并設置了索引的粒度為8192。
通過使用SummingMergeTree引擎,您可以對某些列進行求和聚合,并存儲聚合結果,以提高查詢性能和減少存儲空間。這對于需要頻繁進行求和操作的場景非常有用,可以加快查詢速度并節省存儲成本。