ClickHouse实战--ClickHouse的主键

ClickHouse实战–ClickHouse的主键

在ClickHouse中,存储的数据会按主键进行排序。这其实是创建了一个稀疏索引,从而可以加快数据的查询。本文介绍ClickHouse主键的作用,和排序键的关系。

主键的作用

定义主键时,列的数量并没有明确的限制,主键可以包含一列或多列。主键的作用主要有:

  • 改善索引的性能

    如果当前主键是 (a, b) ,在下列情况下添加另一个 c 列会提升性能:

  • 查询会使用 c 列作为条件

  • 很长的数据范围( index_granularity 的数倍)里 (a, b) 都是相同的值,并且这样的情况很普遍。也就是说,就是加入另一列后,可以让您的查询跳过很长的数据范围。

  • 改善数据压缩

    ClickHouse 以主键排序片段数据,所以,数据的一致性越高,压缩越好。

  • CollapsingMergeTreeSummingMergeTree 引擎里进行数据合并时会提供额外的处理逻辑

    在这种情况下,指定与主键不同的 排序键 也是有意义的。

  • 长的主键会对插入性能和内存消耗有影响,但主键中额外的列并不影响 SELECT 查询的性能。

  • 可以使用 ORDER BY tuple() 语法创建没有主键的表。在这种情况下 ClickHouse 根据数据插入的顺序存储。如果在使用 INSERT ... SELECT 时希望保持数据的排序,可以设置 max_insert_threads = 1

主键的创建

主键是在创建表时,通过PRIMARY KEY指定的,可以通过两种方式指定主键:

  • 在列表内指定
CREATE TABLE db.table_name
(
    name1 type1, name2 type2, ...,
    PRIMARY KEY(expr1[, expr2,...])]
)
ENGINE = engine;
  • 在列表外指定
CREATE TABLE db.table_name
(
    name1 type1, name2 type2, ...
)
ENGINE = engine
PRIMARY KEY(expr1[, expr2,...]);

注意:

  • 创建主键会自动为主键的列创建索引;
  • ClickHouse 不要求主键唯一,所以可以插入多条具有相同主键的行;
  • 使用索引通常会比全表描述要高效。

主键和排序键(oder by)

  • 创建表时,一般不需要指定主键,只要指定排序键即可。当没有指定主键(primary key)时,会把order by后面的列作为主键。
  • 可以同时指定排序键(order by)和主键(primary key),但主键最好是排序键的前缀。

当指定的主键和排序键不同时:

  • 此时排序键用于在数据片段中进行排序,主键用于在索引文件中进行标记的写入。
  • 主键表达式元组必须是排序键表达式元组的前缀,即主键为(a,b),排序列必须为(a,b,******)。

小结

通过以上分析可知:

  • 在创建表时指定主键,会根据主键创建索引;
  • 主键可以是多个列,不会影响查询性能,而且主键相同的数据可以重复;
  • 一般不指定主键(primary key),而是指定排序键(order by),此时会把排序键作为主键;
  • 排序键和主键可以不同,但此时主键必须时排序键的前缀。
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值