跳数索引
clickhouse 数据库为列式数据库,其本身并没传统关系型数据库中所指的二级索引,clickhouse 提供了一种适用于列存检索的跳数索引算法来替代二级索引。 ·跳数索引类型 · minmax
这种轻量级索引类型不需要参数。它存储每个块的索引表达式的最小值和最大值(如果表达式是一个元组,它分别存储元组元素的每个成员的值)。对于倾向于按值松散排序的列,这种类型非常理想。在查询处理期间,这种索引类型的开销通常是最小的。 · set
这种轻量级索引类型接受单个参数max_size,即每个块的值集 (0允许无限数量的离散值) 。这个集合包含块中的所有值 (如果值的数量超过max_size则为空) 。这种索引类型适用于每组颗粒中基数较低 (本质上是“聚集在一起”) 但总体基数较高的列。 · Bloom Filter Types
Bloom filter是一种数据结构,它允许对集合成员进行高效的是否存在测试,但代价是有轻微的误报。在跳数索引的使用场景,假阳性不是一个大问题,因为惟一的问题只是读取一些不必要的块。潜在的假阳性意味着索引表达式应该为真,否则有效的数据可能会被跳过。
在生产中只对枚举值比较多的字段诸如订单id,商品id用 bloom_filter 跳数索引,其他索引没有使用,因为 bloom_filter 的索引文件不至于太大,同时对于值比较多的列又能起到比较好的过滤效果。 避免使用final
ClickHouse 中我们可以使用 ReplacintMergeTree 来对数据进行去重,这个引擎可以在数据主键相同时根据指定的字段保留一条数据,ReplacingMergeTree 只是在一定程度上解决了数据重复问题,由于自动分区合并机制在后台定时执行,所以并不能完全保障数据不重复。我们需要在查询时在最后执行 final 关键字,final 执行会导致后台数据合并,查询时如果有 final 效率将会极低,我们应当避免使用 final 查询,那么不使用 final 我们可以通过自己写SQL方式查询出想要的数据,举例如下:
create table t_replacing_table(
id UInt8,
name String,
age UInt8
) engine = ReplacingMergeTree(age)
order by id;
insert into t_replacing_table values (1,'张三',18),(2,'李四',19),(3,'王五',20);
insert into t_replacing_table values (1,'张三',20),(2,'李四',15);
#自己写SQL方式实现查询去重后的数据,这样避免使用final查询,效率提高
SELECT
id,
argMax(name, age) AS namex,
max(age) AS agex
FROM t_replacing_table
GROUP BY id