- 稀疏主索引 - 按所选键对磁盘上的数据进行排序,使 ClickHouse 能在查询时跳过大范围无关的行。
- 增强的数据类型 - 原生支持 JSON、LowCardinality 和 Enum 等类型,从而实现更紧凑的存储和更快的处理。
- 跳过索引 和 全文索引 - 这类二级索引结构使 ClickHouse 能跳过不匹配查询过滤谓词的粒度,尤其适用于文本搜索工作负载。
- 借助自动合并整理实现快速插入 - ClickHouse 专为高吞吐量插入而设计,并会在后台自动合并数据分区片段,这与开放表格式中的合并整理类似。
- 针对并发读取进行了优化 - MergeTree 的列式存储布局结合多层缓存,可支持高并发的实时分析工作负载——而这并非开放表格式的设计目标。
INSERT INTO SELECT 将目录中的数据加载到 MergeTree 表中,以加快分析速度。
连接到目录
查看表
查看 schema
查询数据湖表中的数据
logger_name 这样的列基数可能过高,难以通过分区获得理想效果。我们也没有诸如文本索引之类的索引来进一步缩小扫描范围。这正是 MergeTree 的优势所在。
将数据导入 MergeTree
创建优化后的表
- 不使用
Nullable包装 - 去掉Nullable可提升存储效率和查询性能。 - 在
level、instance_type、thread_name和check_name列上使用LowCardinality(String)- 对不同值较少的列进行字典编码,以获得更好的压缩效果和更快的过滤速度。 - 在
message列上创建一个全文索引 - 可加速基于标记的文本搜索,例如hasToken(message, 'error')。 ORDER BY键为(instance_type, thread_name, toStartOfMinute(event_time))- 让磁盘上的数据布局与常见过滤模式对齐,从而使稀疏主索引能够跳过无关的粒度。
从目录中插入数据
INSERT INTO SELECT 将数据湖表中的约 3 亿行数据加载到我们的 ClickHouse 表中:
再次执行查询
- 稀疏主索引 -
ORDER BY (instance_type, thread_name, ...)键意味着 ClickHouse 可以直接跳到与instance_type = 'm6i.4xlarge'和 `thread_name = ‘TCPHandler’“ 匹配的粒度,将处理的行数从 2.83 亿减少到仅 1400 万。 - 全文索引 -
message列上的text_idx索引使hasToken(message, 'error')可以通过索引命中,而不必扫描每一条消息字符串,从而进一步减少 ClickHouse 需要读取的数据量。