常见问题
更新时间:2025-01-22
如何配置数据索引
ClickHouse是⼀款⾼性能的列式数据库,通过其独特的索引机制,实现了极⾼的查询效率和吞吐量。 ClickHouse中的索引类型丰富多样,每种类型适⽤于不同的场景。以下是ClickHouse中的主要索引类型及其选择策略:
一、主要索引类型
- 主键索引(Primary Key Index)
- 定义:主键索引是最常⽤的索引类型之⼀,⽤于唯⼀标识每条记录。在ClickHouse中,主键索引可 以加速数据的查找和聚合操作。
- 特点:主键索引由稀疏索引和段内数据排序组成。数据写⼊时按照主键排序(如果指定了ORDER BY),每次插⼊新的数据块时,ClickHouse会在磁盘上⽣成新的稀疏索引。每个稀疏索引条⽬对应 ⼀个数据块中的⾸⾏,索引条⽬记录该块的⾸个主键值以及其在数据⽂件中的位置。
- 使⽤场景:适⽤于需要唯⼀标识记录的场景,如⽤户ID、订单号等。
- 排序键索引(Sorting Key Index)
- 定义:排序键索引是根据指定的列对数据进⾏排序存储的索引类型。
- 特点:在ClickHouse中,可以通过指定ORDER BY关键字来创建排序键索引。排序键索引与主键索 引密切相关,默认情况下主键与排序键相同。排序键索引可以加速按排序键进⾏查询和聚合操作。
- 使⽤场景:适⽤于需要按特定列进⾏排序查询的场景,如按时间戳排序的事件⽇志查询。
- 辅助索引(Secondary Index,也称为跳数索引或数据跳过索引)
- 定义:辅助索引⽤于加速查询列数据,提⾼查询效率。在ClickHouse中,辅助索引允许在查询时跳 过那些不相关的数据块,从⽽减少不必要的磁盘I/O。
- 类型:
类型 | 类型说明 |
---|---|
minmax索引 | 记录每个数据段的最⼩值和最⼤值。对于范围查询,如 WHERE column > x |
AND column < y ,ClickHouse可以跳过不在范围内的块。 | |
bloom_filter索引 | ⽤于⾼基数的数据列,如字符串或ID字段。布隆过滤器可以快速过滤掉不 |
可能匹配的数据块。 | |
tokenbf_v1索引 | ⼀种适⽤于包含⼤量词汇的字段(如⽂本)的布隆过滤器索引,能够对包含 |
某个词的查询进⾏加速。 | |
ngrambf_v1索引 | 基于n-gram的布隆过滤器索引,适⽤于需要精确匹配短字符串的场景。 |
set索引 | 记录每个数据段中特定列的唯⼀值集合,适⽤于精确匹配的场景。 |
inverted索引 | 倒排索引,适⽤于需要快速查找某个值在哪些数据块中存在的场景。 |
- 使⽤场景:适⽤于列上具有⾼度稀疏性或数据分布不均匀的场景,以及需要加速范围查询、精确匹 配等操作的场景。
- 稠密索引(Dense Index)
- 定义:稠密索引存储了每⼀条记录的索引信息,可以提⾼范围查询的速度。
- 特点:与稀疏索引不同,稠密索引会为每⼀⾏数据都创建⼀个索引条⽬。虽然稠密索引在理论上可 以提供更快的查询速度,但由于其占⽤空间较⼤,且会增加数据插⼊、更新和删除的开销,因此在 ClickHouse中并不常⽤。
- 使⽤场景:适⽤于数据分布稠密、需要频繁进⾏范围查询的场景,但考虑到其性能和空间开销,实 际应⽤中需谨慎使⽤。
二、索引选择策略
在选择ClickHouse的索引类型时,需要综合考虑多个因素,包括数据特点、查询需求、性能要求等。以下是⼀些建议:
- 根据查询需求选择索引类型:
- 如果查询中经常涉及主键列的查找和聚合操作,应优先考虑使⽤主键索引。
- 如果查询中经常需要进⾏范围查询,如按时间戳筛选数据,可以考虑使⽤minmax索引或稠密索引 (但需注意稠密索引的空间开销)。
- 如果查询中涉及对⾼基数列(如字符串或ID字段)的精确匹配,可以考虑使⽤bloom_filter索引。
- 根据数据特点优化索引设计:
- 避免在低基数(即值的数量很少)的列上创建索引,因为这样的索引往往效果不佳。
- 当多个列经常⼀起⽤于查询条件时,可以考虑创建复合索引(通过ORDER BY⼦句指定多个列)。
- 控制索引的⼤⼩和数量:
- 索引会占⽤额外的存储空间,并且会增加数据插⼊、更新和删除的开销。因此,在创建索引时要注 意控制索引的⼤⼩和数量,避免过度索引。
- 可以通过设置 GRANULARITY 参数来控制索引的粒度,从⽽平衡索引的⼤⼩和查询性能,⼀般建 议⼤⼩为8192。
- 定期维护索引:
- 随着数据的插⼊、更新和删除,索引可能会变得碎⽚化,导致查询性能下降。定期对索引进⾏维 护,如重建索引、合并索引等,可以保持索引的⾼效性。
- 结合使⽤多种索引类型:
- 在某些复杂查询场景中,可能需要结合使⽤多种索引类型来达到最佳的查询性能。例如,在按时间 戳排序的事件⽇志查询中,可以同时使⽤主键索引(基于⽤户ID)和minmax索引(基于时间戳) 来加速查询。
综上所述,ClickHouse提供了多种索引类型以满⾜不同的查询需求和数据特点。在选择索引类型时,需要根据实际情况进⾏综合考虑和优化设计。
如何定时删除数据
定期删除是在建表语句的ttl里面定义,另外在配置里面也可以定义ttl的转存。
用这个语句定义 query_log的保存天数。示例:
ALTER TABLE system.query_log
MODIFY TTL event_time + INTERVAL 7 DAY;