表引擎
表引擎(表的类型)决定:
- 数据存储在何处以及以何种方式存储、写入到哪里以及从哪里读取。
- 支持哪些查询,以及具体如何执行这些查询。
- 并发访问数据的方式。
- 是否以及如何使用索引(如果存在)。
- 是否可以进行多线程的请求执行。
- 数据复制的相关参数。
引擎家族
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 TABLE 和 DESCRIBE TABLE 的查询结果中也看不到它们。虚拟列是只读的,因此无法向虚拟列中插入数据。
要从虚拟列中读取数据,必须在 SELECT 查询中显式指定其名称。SELECT * 不会返回虚拟列中的值。
如果在创建表时定义了一个与该表某个虚拟列同名的列,则该虚拟列将变得不可访问。不推荐这样做。为避免冲突,虚拟列名称通常会以下划线作为前缀。
-
_table— 包含读取数据所在表的名称。类型:String。无论使用哪种表引擎,每个表都包含一个名为
_table的通用虚拟列。在使用 Merge 表引擎查询表时,可以在
WHERE/PREWHERE子句中对_table设置常量条件(例如,WHERE _table='xyz')。在这种情况下,只会对满足_table条件的这些表执行读取操作,因此_table列在此处充当索引。当使用类似
SELECT ... FROM (... UNION ALL ...)格式的查询时,可以通过指定_table列来确定返回的行来自哪个实际表。