一.概叙
索引用于帮助快速过滤或查找数据,doris主要有以下2类索引:
①内建自动创建的智能索引:前缀索引和ZoneMap 索引。
②用户手动创建的二级索引:倒排索引、bloomfilter 索引、ngram bloomfilter 索引 和 bitmap 索引。
二.智能索引
1.前缀索引
在 Aggregate、Unique 和 Duplicate 三种数据模型中。底层的数据存储,是按照各自建表语句中,AGGREGATE KEY、UNIQUE KEY 和 DUPLICATE KEY 中指定的列进行排序存储的。而前缀索引,即在排序的基础上,实现的一种根据给定前缀列,快速查询数据的索引方式。
前缀索引是稀疏索引,不能精确定位到 Key 所在的行,只能粗粒度地定位出 Key 可能存在的范围,然后使用二分查找算法精确地定位 Key 的位置。
特别注意:Doris 只有前 36 个字节能走前缀索引,所以:
①建表的时候key一定要手动指定,比如明细模型不建议使用默认key
②索引字段的类型和长度尽可能精确,从而增大索引范围。能使用int的坚决不使用bigint
2. ZoneMap 索引
ZoneMap 索引是在列存格式上,对每一列自动维护的索引信息,包括 Min/Max,null 值个数等等。在数据查询时,会根据范围条件过滤的字段按照 ZoneMap 统计信息选取扫描的数据范围。
而doris默认是列式存储,ZoneMap索引无需使用者额外操作。
三.用户手动创建的二级索引
1.倒排索引
倒排索引可以用来进行文本类型的全文检索、普通数值日期类型的等值范围查询,快速从海量数据中过滤出满足条件的行。
比如前缀索引只能命中36个字节。但是之后的字段想要做查询加速就可以考虑添加倒排索引。具体使用方式参考官网即可。
使用限制:
①Aggregate KEY 表模型:只能为 Key 列建立倒排索引。
②Unique KEY 表模型:需要开启 merge on write 特性,开启后,可以为任意列建立倒排索引。
③Duplicate KEY 表模型:可以为任意列建立倒排索引。
2.BloomFilter 索引
支持用户对取值区分度比较大的字段添加 BloomFilter 索引,适合在基数较高的列上进行等值查询的场景。
建议:高基数(5000 以上)列上构建,另外注意BloomFilter 索引只对 in 和 = 过滤查询有加速效果
3.NGram BloomFilter索引
NGram BloomFilter 索引是为了提升LIKE的查询性能
建议:亿级别以上数据,如果有模糊匹配,使用倒排索引或者是 NGram Bloomfilter,另外注意NGram BloomFilter 只支持字符串列,且NGram BloomFilter 索引和 BloomFilter 索引为互斥关系,即同一个列只能设置两者中的一个
4.Bitmap 索引
①Bitmap 索引能够应用在 Duplicate
、Uniq
数据模型的所有列和 Aggregate
模型的 key 列上。
②Bitmap 索引仅在 Segment V2 下生效。当创建 Index 时,表的存储格式将默认转换为 V2 格式。
③适用于低基数的列上,建议在 100 到 100,000 之间,如:职业、地市等。重复度过高则对比其他类型索引没有明显优势;重复度过低,则空间效率和性能会大大降低。特定类型的查询例如 COUNT, OR, AND 等逻辑操作因为只需要进行位运算。该索引更多的适合正交查询