表引擎 (表的类型) 决定了:
- 数据如何存储、存储在何处、写入到哪里以及从哪里读取。
- 支持哪些查询,以及支持方式。
- 数据的并发访问。
- 是否使用索引 (如果存在) 。
- 是否支持多线程请求执行。
- 数据复制参数。
引擎系列
MergeTree
这是最通用、功能最丰富的一类表引擎,适用于高负载任务。这些引擎的共同特点是支持快速插入数据,并在后台对数据进行后续处理。MergeTree 家族引擎支持数据复制 (通过引擎的 Replicated* 版本) 、分区、二级数据跳过索引,以及其他引擎不支持的功能。
该家族中的引擎:
Log
轻量级引擎,功能精简。当你需要快速写入许多小表 (最多约 100 万行) ,并在之后整体读取时,这类引擎的效率最高。
该家族中的引擎:
集成引擎
用于与其他数据存储和处理系统进行通信的引擎。
该家族中的引擎:
特殊引擎
该家族中的引擎:
| 特殊引擎 |
|---|
| 特殊表引擎 |
| 别名 |
| Distributed |
| 字典 |
| Merge |
| Executable |
| File 表引擎 |
| Null |
| Set |
| Join |
| URL |
| View |
| Memory |
| Buffer |
| 外部数据 |
| GenerateRandom |
| KeeperMap |
| FileLog |
虚拟列
虚拟列是表引擎的内置属性,在引擎源代码中定义。
你不应在 CREATE TABLE 查询中指定虚拟列,并且在 SHOW CREATE TABLE 和 DESCRIBE TABLE 查询结果中也看不到它们。虚拟列也是只读的,因此你不能向虚拟列插入数据。
要从虚拟列中选择数据,你必须在 SELECT 查询中显式指定其名称。SELECT * 不会返回虚拟列中的值。
如果你创建的表中某一列与该表的某个虚拟列同名,则该虚拟列将无法访问。我们不建议这样做。为帮助避免冲突,虚拟列名通常以下划线作为前缀。
-
_table— 包含读取数据的表名。Type: String.无论使用哪种表引擎,每个表都包含一个名为
_table的通用虚拟列。使用 Merge 表引擎查询表时,你可以在
WHERE/PREWHERE子句中为_table设置常量条件 (例如WHERE _table='xyz') 。在这种情况下,只会读取满足_table条件的那些表,因此_table列可充当索引。当使用
SELECT ... FROM (... UNION ALL ...)这种格式的查询时,我们可以通过指定_table列来确定返回的行实际来自哪个表。