第2.3章:StarRocks表设计--排序键和前缀索引

StarRocks最佳实践经验 阅读详情

在介绍StarRocks的四种数据模型时,我们多次提到了排序键,也列出了一些排序键的注意事项,现在咱们来一起研究下到底什么是排序键。

1排序键

StarRocks为了加速查询,底层的数据是按照指定的列排序存储的,这部分用于排序的列(可以是一列或多列),就称为排序键(Sort Key)。以排序列作为条件进行数据查找,会非常的高效。

直观来看,各个模型的排序键就是建表语句中DUPLICATE KEY、AGGREGATE KEY、UNIQUE KEY或PRIMARY KEY后面指定的列。但是四种模型的排序键还是有一些区别:

明细模型:

明细模型排序键写法比较灵活,可以指定部分的维度列为排序键。比如表table02(严格来说它是没有指标列的):

CREATE TABLE IF NOT EXISTS starrocks.table02 (

    event_time DATETIME NOT NULL COMMENT "datetime of event",

    event_type INT NOT NULL COMMENT "type of event",

    user_id INT COMMENT "id of user",

    channel INT COMMENT ""

)

DUPLICATE KEY(event_time, event_type,user_id)

DISTRIBUTED BY HASH(user_id) BUCKETS 10;

若我们使用DUPLICATE KEY()显式定义排序键,单从建表不报错的角度,可以有四种组合:

event_time

event_time, event_type

event_time, event_type, user_id

event_time, event_type, user_id, channel

可以发现,这四种组合的共同点是都是从表的首列开始,是连续的,且都和建表语句中列的顺序相同。这也正是排序键的定义要求:在建表时,用于排序的这些列需要定义在其他列之前,并且在指定排序键的时候列的顺序要和建表语句中的相同,否则建表语句会报错。

还以table02为例,若DUPLICATE KEY后的排序列写为:DUPLICATE KEY(event_type)或DUPLICATE KEY(event_type, event_time)或DUPLICATE KEY(event_time, user_id, event_type),就都是错误的。

明细模型下,若我们省略排序键的语句,那么StarRocks通常会默认指定表结构的前三列作为排序键。

聚合模型:

聚合模型的排序键只能是把所有的维度列都写上去,或者干脆把排序键这里整个不写(默认也会使用所有的维度列)。以下面的table03为例,排序键只有一种组合,就是:AGGREGATE KEY(site_id, date, city_code, state),要么这一句整个省略,不然如果写为AGGREGATE KEY(site_id)或者AGGREGATE KEY(site_id, date)都是会报错的。

CREATE TABLE IF NOT EXISTS starrocks.table03 (

    site_id LARGEINT NOT NULL COMMENT "id of site",

    date DATE NOT NULL COMMENT "time of event",

    city_code VARCHAR(20) COMMENT "city_code of user",

    state INT COMMENT "web state",

    pv BIGINT SUM DEFAULT "0" COMMENT "total page views"

)

DISTRIBUTED BY HASH(site_id) BUCKETS 8;
 

更新模型/主键模型:

更新模型和主键模型的排序键只有一种写法,就是在UNIQUE KEY()的括号中指定。以table04为例,建表时排序键语句为UNIQUE KEY(create_time, order_id),则用于排序的列就是create_time和order_id。更新模型/主键模型的排序键必需显式指定,不能省略不写。

总结一下排序键的注意事项:

1、排序键中包含的列必须是从第一列开始,并且是连续的;

2、排序键中列的顺序是由create table语句中的列顺序决定的;

3、排序键不需要包含过多的列。如果选择了大量的列用于排序,那么排序的开销会导致数据导入的时间和资源使用增加;

4、在大多数时候,排序键中的前面几列也能很准确的定位到数据行所在的区间,更多列的排序也不会带来查询的提升;

5、排序键的选择需要结合查询场景,我们需要把经常作为查询条件的列建议放在排序键中。当排序键涉及多个列的时候,我们要将区分度高、经常查询的列建议放在前面。若一个字段只是偶尔查询,不需要将其放入排序键(当使用更新模型或主键模型时尤其注意这一点)。

2前缀索引

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

首先明确一点,前缀索引不需要我们单独手动创建或指定,在建表时其实已经默认完成了指定,它是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表中(这个表上层不可感知)。

举例说明,我们创建表table06:

CREATE TABLE IF NOT EXISTS starrocks.table06 (

    user_id BIGINT NOT NULL,

    age INT NOT NULL,

    message VARCHAR(100),

    max_time DATETIME,

    min_time DATETIME

) DUPLICATE KEY(user_id, age, message)

DISTRIBUTED BY HASH(user_id) BUCKETS 8;

其前缀索引就是user_id(8Byte) + age(4Bytes) + message(prefix 20 Bytes)(遇varchar截断),也就是说,每1024行会取首行的数据的这32个字节作为前缀。

当我们的查询条件可以命中前缀索引时,数据检索流程为:查找shortkey index表,获得逻辑块的起始行号,查找维度列的行号索引,获得目标列的数据块,读取数据块,然后解压解码,从数据块中找到维度列前缀对应的数据项。这样就可以极大的加快查询速度。

而如果查询无法命中前缀,为了定位到数据行的位置,需要进行二分查找,以找到指定区间。此时就需要将查询条件列都加载到内存中,会消耗较多内存空间,对比使用前缀索引时也会耗时一些(当然也不会特别慢,StarRocks还有zone_map索引等其他加速手段)。

比如在table06中,我们执行如下查询:

SELECT * FROM table06 WHERE user_id=1829239 and age=20;

在大数据量下,该查询的效率会远高于如下查询:

SELECT * FROM table06 WHERE age=20;

所以在建表时,合理的设定列的顺序,能够极大地提高查询效率。
 

第2.2章 StarRocks表设计实战——排序键选择与查询性能优化 本文深入探讨了StarRocks表设计中排序键的核心作用与选择策略。排序键决定了数据在磁盘上的物理存储顺序,是查询性能优化的关键。文章结合明细、聚合、更新和主键四大数据模型,详细解析了排序键的定义规则、设计原则(如高频过滤列优先、高基数列优先),并通过真实案例对比,指导读者如何根据业务查询模式设计高效的排序键,从而避免全表扫描,实现查询加速。 阅读详情

相关推荐

Flink-StarRocks详解:第四部分StarRocks分区管理,数据压缩(第54天)

本文为Flink-StarRocks详解后续章节:主要详解StarRocks分区分桶管理,数据压缩,由于篇幅过长,后续接着下面进行详解: StarRocks查询数据湖 实现即席查询案例。

syhiiu的博客 5092

StarRocks 中的数据模型和索引使用

数据冷热特征,比如最近几天的数据才需要修改,老的冷数据很少需要修改,比如订单数据,老的订单完成后就不在更新,并且分区是按天进行分区的,那么在导入数据时历史分区的数据的主键就不会被加载,也就不会占用内存了,内存中仅会加载近几天的索引。字节,其内容为数据块中第一行数据的排序列组成的前缀,在查找前缀索引表时可以帮助确定该行数据所在逻辑数据块的起始行号。需要注意的是:由于存储引擎会为主键建立索引,导入数据时会把索引加载到内存中,所以主键模型对内存的要求更高,所以不适合主键模型的场景还是比较多的。

小毕超博客 6843

StarRocks从入门到精通系列四:表设计

StarRocks从入门到精通系列四:表设计

zhengzaifeidelushang的博客 960

第2.6章:StarRocks表设计--列级别索引

StarRocks支持列级别的索引技术,比如,Bitmap索引适合低基数列,可以快速计算出枚举类型的列满足一定条件的行。Bloomfilter索引用于高基数列,可快速判断数据块中不含所查找值。 在入门阶段,我们不需要研究实现原理,可以先明确它们的使用场景,并尝试实践应用。 1 Bitmap索引 1.1适用场景 非前缀过滤:前面提到过,StarRocks对于表结构中的前几列可以通过前缀索引快速过滤。如果需要对非前置列进行快速过滤,就可以对这些列建立Bitmap索引。 多列过滤:Bitmap可以快速的

流木的博客 5285

XGBoost调参新姿势:Bayesian优化实战指南(附完整代码)

本文详细介绍了如何使用Bayesian优化方法高效调优XGBoost模型参数。通过解析Bayesian优化核心原理和XGBoost关键参数,提供完整的实战代码示例,帮助读者掌握这一智能调参技术,显著提升模型性能。文章特别适合机器学习工程师和数据科学家阅读。

weixin_42536058的博客 366

openEuler服务器离线安装实战:从Docker到Samba的完整避坑指南

本文提供了一份详尽的openEuler服务器离线部署实战指南,重点解决了在无网络环境下安装Docker、Samba等软件的依赖难题。文章深入对比了`dnf install`、`rpm`直接安装及禁用仓库安装三种核心方法,并分享了构建本地DNF仓库的进阶策略,旨在帮助运维人员构建高效可靠的离线部署工作流。

weixin_29210759的博客 71

第2.10章:StarRocks表设计--Schema Change

在分布式表中,Schema Change的限制是比较多的,有些情况还会是一个比较重的操作。StarRocks中目前进行schema change的方式有三种:sorted schema change,direct schema change和linked schema change。sorted schema change会改变列的排序方式,需对数据进行重新排序。3)只能修改列的类型、注释和位置,不支持修改列名和默认值,所以在修改列时,列名和默认值需在修改语句中按照原属性显式的写出;例如修改列的类型等。..

流木的博客 7380

通义灵码+高德 MCP:40分钟开发出游攻略网站

本文介绍了通义灵码与高德MCP在40分钟内快速开发出游攻略网站的全流程。主要内容包括:1)LingmaIDE开发环境的使用方法,涵盖界面操作、代码编辑、调试和智能编码功能;2)通义灵码智能体与高德MCP2.0的集成步骤,通过输入旅行需求即可自动生成包含天气卡片、景点路线等元素的HTML页面;3)重点展示了如何将行程规划导入高德地图APP,实现导航、打车等出行功能。整个开发过程充分利用了通义灵码的智能编码能力和高德地图的服务接口,显著提升了旅游类应用的开发效率。

soso1968的博客 985

StartRocks基础表创建和索引选择

StarRocks 提供四种类型的表,包括明细表、主键表、聚合表和更新表,适用于存储多种业务数据,例如原始数据、实时频繁更新的数据和聚合数据。

qq_34735262的博客 2255

ISE 14.7 MCS文件的生成--- Spartan3AN XC3S200AN

步骤一: Generate Programming File生成 .bit文件 步骤二: Tools——>iMPCAT 步骤三: iMPACT Flows——>双击“Create PROM File(PROM File Formatter)” 步骤四: Non-Volatile FPGA——>点击”Spartan 3AN“——>点击“绿色箭头”——>Spartan3AN(bits)——>选择“xc3s200an"——>点击”Add storage Device“—

qq_40039676的博客 2099

大白话系列:什么是微服务

用大白话和实际例子来通俗易懂地告诉你什么是微服务~

2401_87403086的博客 1242

第2.1章 StarRocks表设计——概述

第2.1章 StarRocks表设计——概述

爱吃辣条的博客 2264

解决Keil uVision许可证管理中Unknown Product错误

嵌入式开发中,IDE工具的许可证管理是确保开发环境正常运行的关键环节。Keil uVision作为ARM架构的主流开发工具,其许可证系统采用加密验证机制,通过产品版本识别实现授权控制。当出现Unknown Product错误时,通常源于版本兼容性问题或区域发行版差异,这直接影响开发工具链的可用性。特别是在维护历史项目或使用中国特供版时,开发者常会遇到此类问题。通过分析许可证类型、调整安装配置或建立虚拟化开发环境等工程实践方案,可以有效解决这类授权验证故障,保障嵌入式项目的持续集成与交付效率。

weixin_33743248的博客 363

告别查询卡顿:StarRocks前缀索引与排序键设计实战指南

在大数据分析场景中,查询性能往往成为业务突破的瓶颈。当面对千万级甚至亿级数据量时,一个设计优良的表结构能让查询速度提升10倍以上。StarRocks作为高性能分布式分析引擎,其前缀索引(Prefix Index)与排序键(Sort Key)的设计正是提升查询效率的核心武器。本文将通过实际案例和最佳实践,带你掌握如何通过合理配置这两项关键技术,彻底解决查询延迟问题。 ## 技术原理:前缀索引与排序...

gitblog_00761的博客 593

YOLO26改进 - C2PSA | C2PSA融合DiffAttention差分注意力:轻量级差分计算实现高效特征降噪,提升模型抗干扰能力

本文介绍了 DiffCLIP,一种将差分注意力机制集成到 CLIP 架构的视觉 - 语言模型,并将其应用于 YOLO26。差分注意力机制通过计算两个互补注意力分布的差值,抵消无关信息干扰。单头差分注意力将 Q 和 K 拆分,分别计算注意力分布后做差值融合;多头差分注意力则每个头独立执行差分操作后聚合输出。关键参数 λ 可动态调控噪声抵消强度。我们将 DiffAttention 代码集成到 YOLO26 中,替换原有模块。实验表明,改进后的 YOLO26 在图像 - 文本理解任务中表现出色。

魔改工程师的博客 601

【虚幻引擎UE】UE5 仅需6步轻松实现关卡顺滑切换

【虚幻引擎UE】UE5 仅需6步轻松实现关卡切换

灵境引路人 2万+

第2.1章:StarRocks表设计--概述

建表是使用StarRocks非常重要的一环,规范的表设计在某些场景下甚至能使查询性能有数倍的提升。StarRocks的表设计涉及到的知识点主要包括数据模型选择、分区分桶、排序键和前缀索引、列级别索引以及字段类型等等。 StarRocks的建表语句与MySQL比较相似,但也有自己的特点。我们先在StarRocks中创建一个演示用的数据库starrocks(后续所有的建表咱们都在里面进行),然后用比较规范的建表语句创建表table01。这里的建表语句我们只是先把涉及的点覆盖到,后面会逐项展开说明: mys

流木的博客 5507

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【StarRocks系列】分区分桶、前缀索引

StarRocks 采用分区+分桶的两级数据分布策略,将数据均匀分布各个 BE 节点。查询时能够有效裁剪数据扫描量,最大限度地利用集群的并发性能,从而提升查询性能。表中数据可以根据分区列(通常是时间和日期)分成一个个更小的数据管理单元。查询时,通过分区裁剪,可以减少扫描的数据量,显著优化查询性能。同一个分区中的数据通过分桶,划分成更小的数据管理单元。StarRocks 提供简单易用的分区方式,即表达式分区。此外还提供较灵活的分区方式,即 Range 分区和 List 分区。

技术改变世界 716

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

StarRocks 的学习笔记

StarRocks 是一款极速全场景MPP 分析型数据库,可以“一栈式”的响应企业各类低延迟场景的查询需求。 StarRocks的愿景是能够让用户的数据分析变得更加简单和敏捷。用户无需经过复杂的预处理,就可以用StarRocks 来支持多种数据分析场景的极速分析。 StarRocks的架构简洁,采用了全面向量化引擎,并配备全新设计的 CBO 优化器,查询速度(尤其是多表关联查询)远超同类产品。

weixin_45866849的博客 7738

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Flink-StarRocks详解:第二部分(第52天)

本文为Flink-StarRocks详解后续章节:主要详解StarRocks表设计,聚合,更新,主键三大数据模型。由于篇幅过长,后续接着下面进行详解: StarRocks分区分桶 StarRocks查询数据湖 实现即席查询案例。

syhiiu的博客 6620

StarRocks索引机制:多种索引类型与应用场景

在大规模数据分析场景中,查询性能往往是决定系统成败的关键因素。StarRocks作为一款高性能的分布式分析型数据库,提供了丰富多样的索引机制来优化查询性能。本文将深入探讨StarRocks的各种索引类型、工作原理、适用场景以及最佳实践,帮助您在实际业务中充分发挥索引的威力。 ## StarRocks索引体系概览 StarRocks的索引体系可以分为两大类:自动创建的内置索引和用户手动创建的索引...

gitblog_01047的博客 1313

StarRocks 的表设计规范与监控体系

StarRocks 是一款高性能分析型数据仓库,使用向量化、MPP 架构、CBO、智能物化视图、可实时更新的列式存储引擎等技术实现多维、实时、高并发的数据分析。StarRocks 既支持从各类实时和离线的数据源高效导入数据,也支持直接分析数据湖上各种格式的数据。StarRocks 兼容 MySQL 协议,可使用 MySQL 客户端和常用 BI 工具对接。同时 StarRocks 具备水平扩展,高可用、高可靠、易运维等特性。广泛应用于实时数仓、OLAP 报表、数据湖分析等场景,本文实例版本2.2。

weixin_54735428的博客 1454

浅析StarRocks 表设计:表类型、分布策略与索引

StarRocks 表设计的关键,不是记住每个 DDL 参数,而是建立“写入语义 → 数据分布 → 索引裁剪”的链路思维。表类型回答数据如何进入和更新,分区分桶回答数据如何落盘和并发扫描,排序键与索引回答查询如何少读数据。

weixin_47983718的博客 394

【技术预研】StarRocks官方文档浅析(2)

基于starRocks官方文档,对其内容进行一定解析,方便大家理解和使用。若无特殊标注,startRocks版本是3.2。下面的章节和官方文档保持一致。

记录生活 2373
上一篇: 第2.2章:StarRocks表设计--数据模型
下一篇: 第2.4章:StarRocks表设计--分区分桶与副本数
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值