跳到主要内容
跳到主要内容

表引擎

表引擎(表的类型)决定:

  • 数据存储在何处以及以何种方式存储、写入到哪里以及从哪里读取。
  • 支持哪些查询,以及具体如何执行这些查询。
  • 并发访问数据的方式。
  • 是否以及如何使用索引(如果存在)。
  • 是否可以进行多线程的请求执行。
  • 数据复制的相关参数。

引擎家族

MergeTree

用于高负载任务的最通用且功能最全面的表引擎。这些引擎的共同特性是支持快速写入数据,并在后台对数据进行后续处理。MergeTree 系列引擎支持数据复制(通过引擎的 Replicated* 版本)、分区、二级数据跳过索引,以及其他在其他引擎中不支持的特性。

该家族中的引擎:

MergeTree 引擎
MergeTree
ReplacingMergeTree
SummingMergeTree
AggregatingMergeTree
CollapsingMergeTree
VersionedCollapsingMergeTree
GraphiteMergeTree
CoalescingMergeTree

Log

轻量级的 引擎,仅提供最基础的功能。当需要快速写入许多小表(最多约 100 万行),并在之后整体读取它们时,这些引擎最为高效。

该家族中的引擎:

Log 引擎
TinyLog
StripeLog
Log

集成引擎

用于与其他数据存储和处理系统进行交互的引擎。

该家族中的引擎:

集成引擎
ODBC
JDBC
MySQL
MongoDB
Redis
HDFS
S3
Kafka
EmbeddedRocksDB
RabbitMQ
PostgreSQL
S3Queue
TimeSeries

特殊引擎

该家族中的引擎:

特殊表引擎
Distributed
Dictionary
Merge
Executable
File
Null
Set
Join
URL
View
Memory
Buffer
External Data
GenerateRandom
KeeperMap
FileLog

虚拟列

虚拟列是表引擎的内置属性,在引擎的源代码中定义。

不应在 CREATE TABLE 查询中指定虚拟列,并且在 SHOW CREATE TABLEDESCRIBE TABLE 的查询结果中也看不到它们。虚拟列是只读的,因此无法向虚拟列中插入数据。

要从虚拟列中读取数据,必须在 SELECT 查询中显式指定其名称。SELECT * 不会返回虚拟列中的值。

如果在创建表时定义了一个与该表某个虚拟列同名的列,则该虚拟列将变得不可访问。不推荐这样做。为避免冲突,虚拟列名称通常会以下划线作为前缀。

  • _table — 包含读取数据所在表的名称。类型:String

    无论使用哪种表引擎,每个表都包含一个名为 _table 的通用虚拟列。

    在使用 Merge 表引擎查询表时,可以在 WHERE/PREWHERE 子句中对 _table 设置常量条件(例如,WHERE _table='xyz')。在这种情况下,只会对满足 _table 条件的这些表执行读取操作,因此 _table 列在此处充当索引。

    当使用类似 SELECT ... FROM (... UNION ALL ...) 格式的查询时,可以通过指定 _table 列来确定返回的行来自哪个实际表。