跳转到主要内容
表引擎 (表的类型) 决定了:
  • 数据如何存储、存储在何处、写入到哪里以及从哪里读取。
  • 支持哪些查询,以及支持方式。
  • 数据的并发访问。
  • 是否使用索引 (如果存在) 。
  • 是否支持多线程请求执行。
  • 数据复制参数。

引擎系列

MergeTree

这是最通用、功能最丰富的一类表引擎,适用于高负载任务。这些引擎的共同特点是支持快速插入数据,并在后台对数据进行后续处理。MergeTree 家族引擎支持数据复制 (通过引擎的 Replicated* 版本) 、分区、二级数据跳过索引,以及其他引擎不支持的功能。 该家族中的引擎:

Log

轻量级引擎,功能精简。当你需要快速写入许多小表 (最多约 100 万行) ,并在之后整体读取时,这类引擎的效率最高。 该家族中的引擎:

集成引擎

用于与其他数据存储和处理系统进行通信的引擎。 该家族中的引擎:

特殊引擎

该家族中的引擎:

虚拟列

虚拟列是表引擎的内置属性,在引擎源代码中定义。 你不应在 CREATE TABLE 查询中指定虚拟列,并且在 SHOW CREATE TABLEDESCRIBE TABLE 查询结果中也看不到它们。虚拟列也是只读的,因此你不能向虚拟列插入数据。 要从虚拟列中选择数据,你必须在 SELECT 查询中显式指定其名称。SELECT * 不会返回虚拟列中的值。 如果你创建的表中某一列与该表的某个虚拟列同名,则该虚拟列将无法访问。我们不建议这样做。为帮助避免冲突,虚拟列名通常以下划线作为前缀。
  • _table — 包含读取数据的表名。Type: String. 无论使用哪种表引擎,每个表都包含一个名为 _table 的通用虚拟列。 使用 Merge 表引擎查询表时,你可以在 WHERE/PREWHERE 子句中为 _table 设置常量条件 (例如 WHERE _table='xyz') 。在这种情况下,只会读取满足 _table 条件的那些表,因此 _table 列可充当索引。 当使用 SELECT ... FROM (... UNION ALL ...) 这种格式的查询时,我们可以通过指定 _table 列来确定返回的行实际来自哪个表。
最后修改于 2026年6月10日