索引类型 | 原理 | 适用场景 | 性能提升 | 局限性 | 每条索引大小 | 备注 |
---|---|---|---|---|---|---|
主键索引 | 字段进行排序索引 | 经常用于点查的唯一主键如uuId | 提升点查(logN)和该字段的排序性能 | 只有一个主键索引,多套主键的设置会消耗成倍的存储 | 主键表达式长度 | |
min_max索引 | 记录每个数据块的最大最小值 | 适用于数据入库有序的字段 保证各个part内的数据相对来说独立,交集较少,如数据时间字段 | 可用于过滤大量不相管的数据分区 合理配置可几十上百倍提高性能 | 离散分布于所有数据中的字段不适用,如省份,年龄等 | 2 * 索引表达式长度 | |
set | 记录每个数据块内索引表达式的所有唯一取值 | 适用于每个数据块内基数较低但总体基数高的字段,在区间交集大的情况下作为 min_max 索引的补充 | 提升点查过滤性能 | 如果每个块包含大量惟一值,会造成性能低下,或者由于索引值个数超过max_size使索引在该块内失效。 | N * 索引表达式长度 (N 为数据块内唯一值个数) | |
bloom_filter | 基本的bloom filter实现 | 与 set 类似 | - | 函数支持少;只能进行值的完全匹配,不适用需要字符串分词的场景 | bloom filter 数组大小 | |
tokenbf_v1 | 将字符串分割成单词,并在bloom filter中记录该单词的存在性 | 适用于简单的文本搜索场景,在长字符串中搜索单词(或其它可分割的子字符串)。例如在应用程序的日志中使用 IN 操作符搜索几个类名或行号。 | 提升简单文本搜索场景下的子字符串匹配性能 | 不适用中文分词场景 | bloom filter 数组大小 | |
ngrambf_v1 | 功能与tokenbf_v1相同,但是文本分割方式不一样。该索引将字符串分割成多个ngram,并在 bloom filter 中记录该ngram的存在性 | 适用于简单的文本搜索场景,在长字符串中搜索子字符串。这个索引在对中文等没有单词分隔的语言中进行文本搜索的场景中比tokenbf_v1更有用。 | 提升简单文本搜索场景下的子字符串匹配性能 | 机制简单,不适用于大量文本搜索场景 | bloom filter 数组大小 | |
hypothesis | 记录字段与字段之间、字段与值之间的比较关系 | 如果查询条件中常常出现列与列之间的比较关系,可以适用此索引 | - | 索引表达式只能是单个简单表达式,不能是复合表达式。 | 1 (单个布尔值) | |
inverted | 这是一个实现全文检索的倒排索引 | 适用于在大量文本中进行关键字搜索的场景 | 可达到一至两个数量级的性能提升 | inverted 索引以 index_granularity 为最小粒度,ClickHouse 还需要对的数据块执行实际扫描,而不是直接定位所有包含该字符串的行,所以 gin 的实际性能未达到极致 | 不确定 | 实验性特性 |
Clickhouse 索引类型明细
最新推荐文章于 2024-03-12 17:26:21 发布