You need to enable JavaScript to run this app.
导航
StarRocks行列混存表
最近更新时间:2024.05.28 11:36:03首次发布时间:2024.05.28 11:36:03

StarRocks 属于 OLAP 数据库,原先数据是按列存储的方式,能够提高复杂查询(例如聚合查询)的性能。自 3.2.3 开始,StarRocks 还支持行列混存的表存储格式,能够支撑基于主键的高并发、低延时点查,以及数据部分列更新等场景,同时还保留了原有列存的高效分析能力。

1 整体架构


通过短路读的方式能够跳过一些优化规则,减少查询链路的消耗

  • 查询在fe侧会跳过原有的planner

  • 在be侧会跳过pipeline模型的调度,直接sync 将结果返回给BE

2 短路读

短路读可以用于列存 和行列混存两种形态

  1. 确保系统已经开启短路径查询。短路径查询开启后,满足条件(用于评估是否为点查)的查询会走短路径,直接查询按行存储的数据。
SHOW VARIABLES LIKE '%enable_short_circuit%';
  1. 如果短路径查询未开启,可以执行命令 SET enable_short_circuit = true;,设置变量 [enable_short_circuit](https://docs.starrocks.io/zh/docs/reference/System_variable/#enable_short_circuit323-%E5%8F%8A%E4%BB%A5%E5%90%8E)true

  2. WHERE 子句的条件列在包含所有主键列的基础上,还可以包含其他列。

SELECT * FROM users WHERE id=1;

您可以通过查看查询规划来确认查询是否走短路径。如果查询规划中包括 Short Circuit Scan: true,则代表查询走的是短路径。

MySQL [example_db] EXPLAIN SELECT * FROM users WHERE id=1;
+---------------------------------------------------------+
| Explain String                                          |
+---------------------------------------------------------+
| PLAN FRAGMENT 0                                         |
|  OUTPUT EXPRS:1: id | 2: country | 3: city | 4: revenue |
|   PARTITION: RANDOM                                     |
|                                                         |
|   RESULT SINK                                           |
|                                                         |
|   0:OlapScanNode                                        |
|      TABLE: users                                       |
|      PREAGGREGATION: OFF. Reason: null                  |
|      PREDICATES: 1: id = 1                              |
|      partitions=1/1                                     |
|      rollup: users                                      |
|      tabletRatio=1/6                                    |
|      tabletList=10184                                   |
|      cardinality=-1                                     |
|      avgRowSize=0.0                                     |
|      Short Circuit Scan: true                           | -- 短路径查询生效
+---------------------------------------------------------+
17 rows in set (0.00 sec)

3 行列混存

3.1 创建行列混存表

  1. 开启 FE 配置项 enable_experimental_rowstore
ADMIN SET FRONTEND CONFIG ("enable_experimental_rowstore" = "true");
  1. 建表时在 PROPERTIES 中配置 "STORE_TYPE" = "column_with_row"

说明

  • 必须为主键模型表。

  • __row 列的长度不能超过 1 MB。

  • 自 3.2.4 起,列的类型新增支持 BITMAP、HLL、JSON、ARRAY、MAP 和 STRUCT。

  • 表中除了主键列外必须包含更多的列。

CREATE TABLE users (
  id bigint not null,
  country string,
  city string,
  revenue bigint
)
PRIMARY KEY (id)
DISTRIBUTED BY HASH(id)
PROPERTIES ("storage_type" = "column_with_row");

3.2 增删改数据

和列存表一样,您可以通过数据导入和 DML 语句向行列混存表中增加、删除和修改数据。本小节使用 DML 语句和上述行列混存表进行演示。

  1. 插入数据。
INSERT INTO users (id, country, city, revenue)
VALUES 
(1, 'USA', 'New York', 5000),
(2, 'UK', 'London', 4500),
(3, 'France', 'Paris', 6000),
(4, 'Germany', 'Berlin', 4000),
(5, 'Japan', 'Tokyo', 7000),
(6, 'Australia', 'Sydney', 7500);
  1. 删除一行数据。
DELETE FROM users WHERE id = 6;
  1. 修改一行数据。
UPDATE users SET revenue = 6500 WHERE id = 4;

3.3 查询数据

这里以点查为例。点查走短路径,即直接查询按行存储的数据,可以提高查询性能。
依然使用上述行列混存表进行演示。该表经过上述的建表和数据变更操作,其包含的数据应该为:

MySQL [example_db] SELECT * FROM users ORDER BY id;
+------+---------+----------+---------+
| id   | country | city     | revenue |
+------+---------+----------+---------+
|    1 | USA     | New York |    5000 |
|    2 | UK      | London   |    4500 |
|    3 | France  | Paris    |    6000 |
|    4 | Germany | Berlin   |    6500 |
|    5 | Japan   | Tokyo    |    7000 |
+------+---------+----------+---------+
5 rows in set (0.03 sec)