Merge Table Engine
Merge
引擎(不要与 MergeTree
混淆)并不存储数据,而是允许同时从任意数量的其他表中读取数据。
读取是自动并行化的。不支持向表中写入数据。读取时,将使用实际被读取的表的索引(如果存在)。
创建表
引擎参数
db_name
db_name
— 可能的值:
- 数据库名称,
- 返回数据库名称字符串的常量表达式,例如
currentDatabase()
, REGEXP(expression)
,其中expression
是用于匹配数据库名称的正则表达式。
tables_regexp
tables_regexp
— 用于匹配指定数据库中的表名称的正则表达式。
正则表达式 — re2(支持 PCRE 的一个子集),区分大小写。 请参阅“匹配”部分关于正则表达式转义符号的说明。
table_to_write
table_to_write
- 插入到 Merge
表时要写入的表名。
可能的值:
'db_name.table_name'
- 插入到特定数据库中的特定表。'table_name'
- 插入到表db_name.table_name
。仅在第一个参数db_name
不是正则表达式时允许。auto
- 插入到按字典顺序排列传递给tables_regexp
的最后一个表。仅在第一个参数db_name
不是正则表达式时允许。
使用方法
在选择要读取的表时,即使 Merge
表匹配正则表达式,它本身也不会被选择。这是为了避免循环。
可以创建两个 Merge
表,它们会互相尝试读取对方的数据,但这并不是一个好主意。
使用 Merge
引擎的典型方式是将大量的 TinyLog
表视为单个表进行操作。
示例
示例 1
考虑两个数据库 ABC_corporate_site
和 ABC_store
。all_visitors
表将包含来自两个数据库中 visitors
表的 ID。
示例 2
假设您有一个旧表 WatchLog_old
,并决定在不将数据移动到新表 WatchLog_new
的情况下更改分区,因此您需要查看两个表中的数据。
插入到表 WatchLog
的内容将进入表 WatchLog_new
虚拟列
-
_table
— 包含读取数据的表的名称。类型:String。您可以在
WHERE/PREWHERE
子句中设置对_table
的常量条件(例如,WHERE _table='xyz'
)。在这种情况下,仅对满足_table
条件的表执行读取操作,因此_table
列充当索引。
另请参阅