ClickHouse MergeTree引擎介绍

MergeTree 允许您依据主键和日期创建索引,并进行实时的数据更新操作。MergeTree 是 ClickHouse 里最为先进的表引擎。请注意不要将 MergeTree 跟 Merge引擎混淆。

MergeTree 引擎在创建时接收以下4个参数,

  • 日期字段的名称 (索引字段)
  • 采样表达式 (可选的)
  • 含有主键相关字段的元组
  • 稀疏索引的粒度(见下文)。

不使用采样表达式的例子:

MergeTree(EventDate, (CounterID, EventDate), 8192)*

使用采样表达式的例子:

MergeTree(EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID)), 8192)*

以 MergeTree 作为引擎的数据表必须含有一个独立的 Date 字段。比如说, EventDate 字段。这个日期字段必须是 Date 类型的(非 DateTime 类型)。

主键可以是任意表达式构成的元组(通常是列名称的元组),或者是单独一个字段。

抽样表达式(可选的)可以是任意表达式。这个表达式必须在主键中。上面的例子使用了 CounterID 的哈希 intHash32 作为采样表达式,旨在近乎随机地在 CounterID 和 EventDate 内打乱数据条目。换而言之,当我们在查询中使用 SAMPLE 子句时,我们就可以得到一个近乎随机分布的用户列表。

数据表将数据分割为小的索引块作为单位进行处理。 每个索引块之间依照主键排序。每个索引块记录了指定的开始日期和结束日期。在您插入数据时,MergeTree 就会对数据进行排序处理,以保证存储在索引块内的数据有序。 索引块之间的合并过程会在系统后台定期自动执行。MergeTree 引擎会选择几个相邻的索引块进行合并(通常是较小的索引块), 然后对二者合并、排序。

具体而言, 向 MergeTree 表中插入数据时,引擎会首先对新数据执行递增排序而保存索引块;其后,数据索引块之间又会进一步合并,以减少总体索引块数量。 因此,合并过程本身并无过多排序工作。

向 MergeTree 插入数据时,不同月份的数据会被自动分散在不同索引块中。不同月份的索引块不会被合并。这是为了便于本地化数据修改(以及备份)。

索引块合并时设有体积上限,以避免索引块合并产生庞大的新索引块。

除了保存索引块中的数据外, 引擎会额外保存一个索引文件,以储存每 index_granularity 行的主键值和对应位置,这就构成了对有序数据的稀疏的索引。

对列而言,MergeTree 在每index_granularity行的位置也写入了标记,从而确定数据所在的范围,以便查找。

当使用 SELECT 读取表内数据时, MergeTree 会判断是否能够使用索引。以下两种情况里,索引将被使用:

  1. 当 WHERE 语句或 PREWHERE 语句用于判断相等或不等判关系时 (作为子句);
  2. 或当 IN 语句的对象为主键或者 Date 或者 它们之间的逻辑关系。

因此, MergeTree 能够快速查询一个或多个主键范围的值。在下面的示例中,MergeTree 能够快速的查询一个明确的 CounterID ,指定范围的日期区间里的一个明确的 CounterID ,各种 CounterID 的集合等。

下面例子中的查询会使用基于日期和主键的索引。

SELECT count() FROM table WHERE EventDate = toDate(now()) AND CounterID = 34;
SELECT count() FROM table WHERE EventDate = toDate(now()) AND (CounterID = 34 OR CounterID = 42);
SELECT count() FROM table WHERE ((EventDate >= toDate('2014-01-01') AND EventDate <= toDate('2014-01-31')) OR EventDate = toDate('2014-05-01')) AND CounterID IN (101500, 731962, 160656) AND (CounterID = 101500 OR EventDate != toDate('2014-05-01'));

索引也可以被用在更加复杂的查询之中;读取表的过程是按部就班进行的,所以使用索引绝不会比全表搜索耗时。

示例贴:

可以看到,下面的例子中, MergeTree 无法使用索引。

SELECT count() FROM table WHERE CounterID = 34 OR URL LIKE '%upyachka%'

若要知晓 MergeTree 能否在查询中使用索引, 请配置系统参数 force_index_by_date、 force_primary_key。

全局的索引之中仅仅保存了单个数据索引块的日期范围。然而,一个数据索引块可能包含很多日期的数据(甚乎整月),MergeTree 在数据索引块内部依照主键排序,然而用于分组的日期并不一定在数据表的首列。因此,在查询语句中,如果只有日期范围而没有限定主键范围,这将可能导致不必要的数据读取。

对于并发查询, MergeTree 使用了多版本管理 : 当我们试图同时读取、写入数据时,查询操作将会在已经插入完毕的索引块中进行,而排除没有写入完毕的索引块,正在被写入的块因而不会受到干扰,这个过程没有使用任何锁机制,同时插入操作不会阻塞读取操作。

对 MergeTree 进行读取的操作会在引擎内部自动的被并行执行。

MergeTree 支持 OPTIMIZE 语句,它会调用额外的合并步骤。

它可以管理一张很大的数据表,我们也可以小批量、连续地向其添加数据,这正是 MergeTree 设计之初衷。

它支持数据备份功能,具体见 数据副本一章。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容