美文网首页
2022-12-14 前缀索引

2022-12-14 前缀索引

作者: felix_feng | 来源:发表于2022-12-14 09:27 被阅读0次

    为加速查询,StarRocks 在内部组织和存储数据时,会把表中数据按照指定的一个或多个列进行排序。这些用于排序的列,称之为排序键 (Sort Key)。

    为减少内存开销,StarRocks 在排序键的基础上又引入了前缀索引 (Prefix Index)。表中每 1024 行数据构成一个逻辑数据块 (Data Block)。每个逻辑数据块在前缀索引表中存储一项索引,内容为表的维度列的前缀,并且长度不超过 36 字节。前缀索引是一种稀疏索引,使用某行数据的维度列的前缀查找索引表,可以确定该行数据所在逻辑数据块的起始行号。前缀索引的大小会比数据量少 1024 倍,因此会全量缓存在内存中,在实际查找的过程中可以有效加速查询。

    前面提到,StarRocks的底层数据是按照排序键排序后存储的。而前缀索引(shortkey index),就是在排序键的基础上实现的一种根据给定前缀列,有效加速查询的索引方式。

    总结一下排序键的注意事项:
    
    1、排序键中包含的列必须是从第一列开始,并且是连续的;
    
    2、排序键中列的顺序是由create table语句中的列顺序决定的;
    
    3、排序键不需要包含过多的列。如果选择了大量的列用于排序,那么排序的开销会导致数据导入的时间和资源使用增加;
    
    4、在大多数时候,排序键中的前面几列也能很准确的定位到数据行所在的区间,更多列的排序也不会带来查询的提升;
    
    5、排序键的选择需要结合查询场景,我们需要把经常作为查询条件的列建议放在排序键中。当排序键涉及多个列的时候,我们要将区分度高、经常查询的列建议放在前面。若一个字段只是偶尔查询,不需要将其放入排序键(当使用更新模型或主键模型时尤其注意这一点)。
    
    首先明确一点,前缀索引不需要我们单独手动创建或指定,在建表时其实已经默认完成了指定,它是StarRocks自带的一种加速方式。前缀索引的默认要求主要有:
    
    1、前缀索引包含的列只能是排序键中的列;
    
    2、前缀索引包含的列数不超过3;
    
    3、前缀索引的字节数不超过36字节;
    
    4、前缀索引不能包含FLOAT/DOUBLE类型的列;
    
    5、前缀索引中VARCHAR类型列只能出现一次,并且是末尾位置(即使没有达到36个字节,如果遇到VARCHAR,也会直接截断,不再往后继续);
    
    6、若在建表语句中指定PROPERTIES {"short_key" = "integer"}时, 可突破上面的第2、3条限制。
    
    StarRocks默认每1024行构成一个逻辑块,取逻辑块首行数据的前36个字节作为这行数据的前缀索引存储在shortkey index表中(这个表上层不可感知)。
    

    相关文章

      网友评论

          本文标题:2022-12-14 前缀索引

          本文链接:https://www.haomeiwen.com/subject/ifxkqdtx.html