我是靠谱客的博主 难过红酒,最近开发中收集的这篇文章主要介绍StarRocks建表优化全流程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

查看StarRocks版本

select current_version();

查看状态

MySQL> SHOW PROC "/brokers"G 
mysql> SHOW PROC '/backends'G 
mysql> SHOW PROC '/frontends'G

StarRocks的1副本意思是仅有一份数据,三副本为共有三份数据

创建表

前缀索引,where条件的放在表的前三列(前两列date/int,string放在第三列),其他需要作为查询条件的字段,通过物化视图实现(未使用到聚合查询,通过创建索引来实现)。

分区和桶设置

分区是针对表的,是对表的数据取段。分桶是针对每个分区的,会将分区后的每段数据打散为逻辑分片Tablet。副本数是针对Tablet的,是指Tablet保存的份数。那么我们不难发现,对某一个数据表,若每个分区的分桶数一致,其总Tablet数:

  • 总Tablet数=分区数*分桶数*副本数
show tablet from 表名;
  • 分区:90天一个分区 (每个分区数据23.7G)

修改表所有分区的副本数

ALTER TABLE 数据库.表 MODIFY PARTITION(*) SET ("replication_num" = "3");

修改表的默认副本数量,新建分区副本数量默认使用此值:

ALTER TABLE 数据库.表 SET ("default.replication_num" = "2");
  • 桶:3*24/2=36桶(每个桶数据675M)分桶:为了保证数据不倾斜,我们会根据业务选择一列或者多列进行分桶

查看服务器cpu数、核数,确认桶数量

分桶键选择:分桶的目的我们一直在说是为了将数据打散,所以分桶键就需要选择高基数的列(去重后数据量最大的列)。分桶后的数据如果出现严重的数据倾斜,就可能导致系统局部的性能瓶颈,所以我们也可以视情况使用两个或三个列作为分桶键,尽量的将数据均匀分布

分桶数:分桶数的设置需要适中,如果分桶过少,查询时查询并行度上不来(CPU多核优势体现不出来)。而如果分桶过多,会导致元数据压力比较大,数据导入导出时也会受到一些影响。

这里需要注意的是,已创建分区的分桶数不能修改(有其他方式能实现,但比较麻烦),所以前期设定合适的分桶数非常重要。

在机器比较少的情况下,如果想充分利用机器资源可以考虑使用 BE数量 * cpu core / 2来设置bucket数量

# 总核心数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查询物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l # 查看每个物理CPU中core的核数(即个数) cat /proc/cpuinfo| grep "cpu cores"| uniq # 查看逻辑CPU的个数 cat /proc/cpuinfo| grep "processor"| wc -l # 查看总线程数量 grep 'processor' /proc/cpuinfo | sort -u | wc -l

导入数据

  • 全量导入

修改导入脚本的字段顺序

  • 增量导入

修改导入脚本的字段顺序

  • 定时导入

创建物化视图(聚合类场景适合物化视图,物化视图主要用于明细模型的预聚合)新违法只是过滤查询

  • 创建物化视图
CREATE MATERIALIZED VIEW 物化视图名 AS (SQL语句);
  • 查看Base表table11的物化视图表信息,语句为:
desc table11 all;
  • 删除创建完成的物化视图
DROP MATERIALIZED VIEW IF EXISTS 数据库.物化视图名;
  • 删除创建中的物化视图
CANCEL ALTER MATERIALIZED VIEW FROM 数据库.物化视图名;
  • 查看状态
SHOW ALTER MATERIALIZED VIEW FROM 数据库;
  • 查看数据库下所有的物化视图(这里可以用IN或FROM)
SHOW MATERIALIZED VIEW IN 数据库;
  • 解析查询语句是否命中物化视图
EXPLAIN sql语句;

查看是否包含以下内容:

PREAGGREGATION:ON

rollup:物化视图名

创建一下bitmap或者bloomfilter索引

  • BloomFilter索引

-- 创建索引

ALTER TABLE 表名 SET ("bloom_filter_columns" = "字段1,字段2,字段3,字段4,字段5,字段6 ");

-- 查看索引创建状态

SHOW ALTER TABLE COLUMN WHERE TableName = "表名";

-- 查看索引

SHOW CREATE TABLE 表名;

-- 删除索引

ALTER TABLE 表名 SET ("bloom_filter_columns" = "");

-- 修改索引

ALTER TABLE 表名 SET ("bloom_filter_columns" = "字段,字段");
  • Bitmap

-- 创建索引(取值为枚举型,取值大量重复,较低基数,并且用作等值条件查询或者可转化为等值条件查询的列上创建)

CREATE INDEX 索引名称 ON 表名 (字段) USING BITMAP COMMENT '注释';

-- 查看索引创建状态

SHOW ALTER TABLE COLUMN WHERE TableName = "表名";

-- 查看索引

SHOW INDEX FROM 表名;

-- 删除索引

DROP INDEX 索引名 ON 表名;

修改并行度设置成CPU核数量的一半 。

mysql> set global parallel_fragment_exec_instance_num=16

冷热策略和存储介质(待研究)

支持在一个集群内使用多种存储介质(HDD/SSD)。我们就可以为分区设置不同的存储介质

将最新数据所在的分区放在SSD上,利用SSD的随机读写性能来提高查询性能。而老的数据可以放在HDD中,以节省数据存储的成本。

最后

以上就是难过红酒为你收集整理的StarRocks建表优化全流程的全部内容,希望文章能够帮你解决StarRocks建表优化全流程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部