StarRocks 属于 OLAP 数据库,原先数据是按列存储的方式,能够提高复杂查询(例如聚合查询)的性能。自 3.2.3 开始,StarRocks 还支持行列混存的表存储格式,能够支撑基于主键的高并发、低延时点查,以及数据部分列更新等场景,同时还保留了原有列存的高效分析能力。
通过短路读的方式能够跳过一些优化规则,减少查询链路的消耗
查询在fe侧会跳过原有的planner
在be侧会跳过pipeline模型的调度,直接sync 将结果返回给BE
短路读可以用于列存 和行列混存两种形态
SHOW VARIABLES LIKE '%enable_short_circuit%';
如果短路径查询未开启,可以执行命令 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
。
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)
enable_experimental_rowstore
。ADMIN SET FRONTEND CONFIG ("enable_experimental_rowstore" = "true");
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");
和列存表一样,您可以通过数据导入和 DML 语句向行列混存表中增加、删除和修改数据。本小节使用 DML 语句和上述行列混存表进行演示。
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);
DELETE FROM users WHERE id = 6;
UPDATE users SET revenue = 6500 WHERE id = 4;
这里以点查为例。点查走短路径,即直接查询按行存储的数据,可以提高查询性能。
依然使用上述行列混存表进行演示。该表经过上述的建表和数据变更操作,其包含的数据应该为:
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)