StarRocks 基础使用
本文介绍如何在 BMR 上创建 StarRocks 集群,并通过 MySQL 协议连接集群,完成用户权限管理、库表管理、数据导入和数据查询等基础操作。
产品简介
StarRocks 是一款高性能 MPP 架构分析型数据库,面向实时数仓、OLAP 分析、报表分析、用户画像等场景。StarRocks 兼容 MySQL 协议,用户可以通过 MySQL 客户端、JDBC/ODBC、BI 工具或业务程序直接连接使用。
主要特性:
- 高并发、多维、实时分析能力,支持秒级至分钟级查询响应。
- 兼容 MySQL 协议,可直接使用 MySQL 客户端、DBeaver、DataGrip 等工具连接。
- 支持水平扩展、高可用、高可靠。
- 采用向量化执行引擎和 CBO 优化器,大幅提升查询性能。
- 支持物化视图自动路由加速固定模式查询。
前提条件
- 已完成百度智能云环境准备,登录 BMR 账号。
- 已了解 StarRocks 的基本概念与架构,参考 StarRocks 简介。
架构说明
StarRocks 集群由以下角色组成:
| 角色 | 说明 |
|---|---|
| FE(Frontend) | 负责元数据管理、SQL 解析、查询规划和权限管理 |
| BE(Backend) | 负责数据存储和计算,适用于存算一体模式 |
| CN(Compute Node) | 仅负责计算,适用于存算分离模式 |
| Observer | FE Observer 节点,增强高可用能力,不参与选主 |
BMR 托管集群负责底层运维,用户通常无需直接维护各节点进程。
创建集群
- 登录百度智能云控制台,选择产品服务 > 数据分析 > MapReduce > 集群,进入集群列表页面。
-
点击创建集群,进入集群创建页,配置如下参数:
- 设置集群名称。
- 设置管理员密码(建议设置高复杂度密码并妥善保管)。
- 打开日志开关。
- 集群类型:选择 StarRocks。
- 集群版本:选择所需的 BMR StarRocks 版本(新业务建议选择 StarRocks 3.x 版本)。
- 存储形态:根据业务需求选择存算一体或存算分离。
说明:存算分离形态需 StarRocks 3.x 及以上版本支持。选择存算分离时,需配置数据的共享存储(如 BOS Bucket)。
- 完成实例规格、网络等配置后,点击完成。集群创建后可在集群列表页查看,当集群状态由初始化中变为运行中时,集群创建成功。
说明:生产集群建议开启服务高可用(默认部署 3 个 FE 节点及至少 3 个 BE / CN 节点),以获得更好的性能和稳定性。
规格选型建议
| 场景 | 建议配置 |
|---|---|
| 测试/开发环境 | 小规格 FE + 小规格 BE/CN,主要用于功能验证 |
| 普通离线分析 | 3 FE + 多个 BE,按数据量配置存储 |
| 实时分析/高并发 BI | 3 FE + 多个 CN,合理配置查询超时和并发限制 |
| 生产环境 | 至少 3 FE,开启高可用、监控告警和 SQL 防御 |
连接 StarRocks
StarRocks 兼容 MySQL 协议,FE SQL 连接端口默认为 9030。
使用 MySQL Client 连接
- SSH 登录集群节点,参考 SSH 连接到集群。
- 执行以下命令连接 StarRocks(将
{fe_node_ip}替换为 FE 节点 IP,密码为创建集群时设置的管理员密码):
1mysql -h {fe_node_ip} -P 9030 -u root -p
连接参数说明
| 参数 | 说明 |
|---|---|
-h |
FE 节点 IP 地址或平台提供的连接地址 |
-P |
FE 查询端口,默认为 9030 |
-u |
登录用户名,默认为 root |
-p |
登录密码,为创建集群时设置的管理员密码 |
使用 JDBC 连接
1jdbc:mysql://{fe_node_ip}:9030/{database}
使用 DBeaver / DataGrip 等工具连接
选择 MySQL 驱动,填写 Host(FE 地址)、Port(9030)、用户名和密码即可连接。
注意:StarRocks 集群仅支持 VPC 网络访问,请确保客户端与集群处于同一 VPC 或已打通网络。
用户和权限管理
StarRocks 基于 RBAC(基于角色的访问控制)进行权限管理,支持用户、角色和权限三层体系。
用户管理
1-- 创建用户并指定默认角色
2CREATE USER 'username'@'%' IDENTIFIED BY '******' DEFAULT ROLE db_admin, user_admin;
3
4-- 查看用户列表
5SHOW USERS;
6
7-- 修改用户密码
8ALTER USER 'username'@'%' IDENTIFIED BY '******';
9
10-- 删除用户
11DROP USER 'username'@'%';
权限管理
1-- 授予角色给用户
2GRANT db_admin TO USER 'username'@'%';
3
4-- 授予表级查询权限,并允许转授
5GRANT SELECT ON TABLE tb_primary_key TO USER 'username'@'%' WITH GRANT OPTION;
6
7-- 授予数据库级读写权限
8GRANT SELECT, INSERT ON DATABASE examples.* TO USER 'username'@'%';
9
10-- 查看用户权限
11SHOW GRANTS FOR 'username'@'%';
12
13-- 回收权限
14REVOKE SELECT ON TABLE tb_primary_key FROM USER 'username'@'%';
建议:按最小权限原则为不同业务系统创建独立账号,避免多个系统共用 root 账号。
库表管理
数据库操作
1-- 创建数据库
2CREATE DATABASE IF NOT EXISTS examples;
3
4-- 查看数据库列表
5SHOW DATABASES;
6
7-- 切换数据库
8USE examples;
9
10-- 重命名数据库
11ALTER DATABASE examples RENAME demo;
12
13-- 删除数据库(默认可恢复,加 FORCE 不可恢复)
14DROP DATABASE IF EXISTS demo;
注意:执行
DROP DATABASE后默认 1 天内可通过RECOVER命令恢复;若添加FORCE关键字则直接删除且不可恢复,请谨慎使用。
表模型选择
StarRocks 支持多种表模型,建表时应根据业务场景合理选择:
| 表模型 | 关键字 | 重复主键处理 | 适用场景 |
|---|---|---|---|
| 明细表 | DUPLICATE KEY |
保留所有行 | 日志分析、原始行为流水 |
| 主键表 | PRIMARY KEY |
保留最新行(推荐) | 实时分析、高频更新,如订单状态、用户画像 |
| 聚合表 | AGGREGATE KEY |
按聚合函数汇总 | 固定汇总指标场景 |
| 更新表 | UNIQUE KEY |
保留最新行 | 旧版更新模型,新业务优先评估主键表 |
注意:表创建后不能修改表类型(如明细表不能改成主键表),需重建。
创建数据表
创建一张主键模型(PRIMARY KEY)的数据表:
1USE examples;
2
3CREATE TABLE IF NOT EXISTS tb_primary_key
4(
5 user_id BIGINT NOT NULL COMMENT 'user id',
6 name VARCHAR(32) NOT NULL COMMENT 'user name',
7 age TINYINT NOT NULL COMMENT 'user age',
8 sex TINYINT NOT NULL COMMENT 'user sex',
9 email VARCHAR(256) NULL COMMENT 'email'
10)
11ENGINE = OLAP
12PRIMARY KEY (user_id)
13DISTRIBUTED BY HASH(user_id)
14ORDER BY (`name`)
15PROPERTIES ('replication_num' = '3');
创建一张按日期分区的明细表:
1CREATE TABLE IF NOT EXISTS user_event_detail
2(
3 event_date DATE NOT NULL COMMENT '事件日期',
4 event_time DATETIME NOT NULL COMMENT '事件时间',
5 user_id BIGINT NOT NULL COMMENT '用户ID',
6 event_type VARCHAR(64) COMMENT '事件类型',
7 city VARCHAR(64) COMMENT '城市',
8 amount DECIMAL(18, 2) COMMENT '金额'
9)
10DUPLICATE KEY(event_date, event_time, user_id)
11PARTITION BY date_trunc('day', event_date)
12DISTRIBUTED BY HASH(user_id) BUCKETS 16
13PROPERTIES ('replication_num' = '3');
说明:
ALTER TABLE支持 RENAME、COMMENT、PARTITION、BUCKET、COLUMN、ROLLUP INDEX、BITMAP INDEX、SWAP、COMPACTION 等操作,详情请参考 StarRocks 官方文档。
建表建议
- 大表建议按时间字段分区(如按天或按月),避免单分区数据过大。
- 分桶字段建议选择高基数、查询常用字段(如
user_id、order_id)。 - 生产表建议配置副本数为 3:
PROPERTIES ('replication_num' = '3')。 - 主键表建议开启持久化索引:
'enable_persistent_index' = 'true'。
数据查询
1-- 写入测试数据
2INSERT INTO tb_primary_key VALUES (10001, 'Alice', 25, 0, 'alice@example.com');
3INSERT INTO tb_primary_key VALUES (10002, 'Bob', 30, 1, 'bob@example.com');
4
5-- 查询全部数据
6SELECT * FROM tb_primary_key;
7
8-- 条件查询
9SELECT name, age FROM tb_primary_key WHERE age > 20 LIMIT 100;
10
11-- 聚合查询
12SELECT sex, count(*) AS cnt, avg(age) AS avg_age
13FROM tb_primary_key
14GROUP BY sex;
15
16-- 删除数据
17DELETE FROM tb_primary_key WHERE user_id = 10001;
支持的查询特性:支持 DISTINCT、GROUP BY、HAVING、ORDER BY、LIMIT/OFFSET、UNION/INTERSECT/EXCEPT、CTE(WITH 子句)、子查询(IN / EXISTS / 标量子查询)、各类 JOIN(Inner、Left/Right/Full Outer、Semi、Anti、Cross)。
查询建议
- 查询大表时尽量添加分区过滤条件,避免全表扫描。
- 避免在生产环境使用无
WHERE条件的SELECT *,建议添加LIMIT。 - Join 查询确保 Join Key 类型一致,避免隐式转换影响性能。
- 高频固定查询场景可以评估使用物化视图进行加速。
数据导入
StarRocks 支持多种导入方式:
| 导入方式 | 适用数据源 | 支持格式 | 适用规模 |
|---|---|---|---|
| INSERT INTO | 少量写入、测试验证 | SQL | 受内存限制 |
| Stream Load | 本地文件或程序生成数据 | CSV、JSON | 10 GB 以内 |
| Broker Load | 对象存储(BOS/S3/OSS)、HDFS | CSV、Parquet、ORC、JSON | 数十至数百 GB |
| Routine Load | Kafka 持续接入 | CSV、JSON、Avro | 微批持续 |
| Flink / Spark Connector | 流批计算引擎 | 多格式 | 大规模 |
INSERT 导入
1INSERT INTO user_event_detail VALUES
2('2026-07-01', '2026-07-01 10:00:00', 10001, 'click', 'beijing', 12.50),
3('2026-07-01', '2026-07-01 10:01:00', 10002, 'pay', 'shanghai', 99.00);
Stream Load 导入 CSV 文件
1curl --location-trusted -u <username>:<password> \
2 -H "label:load_demo_001" \
3 -H "Expect:100-continue" \
4 -H "column_separator:," \
5 -H "skip_header:1" \
6 -H "columns: id, name, score" \
7 -T example.csv -XPUT \
8 http://<fe_host>:8030/api/<database>/<table>/_stream_load
返回结果中 Status 为 Success 表示导入成功;若有失败行,可访问 ErrorURL 查看具体原因。
常用 Stream Load 参数说明
| 参数 | 说明 |
|---|---|
label |
导入任务标签,相同 label 不会重复导入(幂等),失败重试时递增 label |
column_separator |
列分隔符,默认为 \t |
skip_header |
跳过 CSV 文件的前 N 行(通常用于跳过表头) |
columns |
列名映射,支持列转换表达式 |
max_filter_ratio |
允许的错误行比例,默认 0(不允许错误行),调试时可设为 1 |
SQL 防御
SQL 防御用于在 SQL 提交到引擎执行前进行风险识别和拦截,防止低质量 SQL 对集群稳定性造成冲击。建议生产环境默认开启。
防御规则分类
规则按检测时机分为三类:
| 类别 | 触发时机 | 说明 |
|---|---|---|
| 静态规则(static) | SQL 提交时(FE 层) | 基于 SQL 文本结构分析,提交即检测,不依赖运行时状态 |
| 动态规则(dynamic) | SQL 执行计划阶段(BE 层) | 基于执行计划分析,如扫描文件数、分区数等 |
| 运行时规则(running) | SQL 运行中(FE+BE) | 基于运行时指标,如内存占用、运行时长、扫描数据量等 |
命中规则后的行为分为三种:
| 行为 | 说明 |
|---|---|
HIT |
命中提示,不阻断,记录日志 |
INTERCEPT |
拦截,阻止 SQL 执行 |
FUSE |
熔断,对动态/运行时违规行为在下次执行时阻断 |
静态规则(SQL 文本检测)
| 规则 ID | 规则描述 | 建议阈值 | SQL 示例 |
|---|---|---|---|
| static_0001 | SQL 中 COUNT(DISTINCT) 出现次数超限 |
10 | SELECT COUNT(DISTINCT a), COUNT(DISTINCT b) FROM t |
| static_0002 | SQL 中使用了 NOT IN <subquery> |
— | SELECT * FROM t WHERE id NOT IN (SELECT id FROM t2) |
| static_0003 | SQL 中 JOIN 次数超限 | 20 | 多表 JOIN 场景 |
| static_0004 | SQL 中 UNION ALL 次数超限 | 20 | 多个 SELECT ... UNION ALL SELECT ... |
| static_0005 | 子查询嵌套层数超限 | 20 | SELECT * FROM (SELECT * FROM (SELECT ...)) |
| static_0006 | SQL 语句字符串长度超限(单位 KB) | 10 KB | 超长 SQL 语句 |
| static_0007 | 多表关联时存在笛卡尔积 | — | SELECT * FROM A, B |
动态规则(执行计划检测)
| 规则 ID | 规则描述 | 建议阈值 |
|---|---|---|
| dynamic_0001 | 扫描文件数超限 | 100,000 |
| dynamic_0002 | 单表操作(SELECT/DELETE/UPDATE/ALTER)涉及分区数超限 | 10,000 |
运行时规则(执行中检测)
| 规则 ID | 规则描述 | 建议阈值 |
|---|---|---|
| running_0001 | SELECT 返回结果行数超限 | 100,000 行 |
| running_0002 | SQL 占用内存峰值超限(MB) | 按集群配置 |
| running_0003 | SQL 已运行时长超限(秒) | 按业务需求 |
| running_0004 | SQL 已扫描数据量超限(GB) | 10,240 GB |
| running_0005 | SQL 运行 CPU 时间超限(秒) | 180 秒 |
推荐 SQL 写法
查询明细数据时添加过滤条件和 LIMIT(避免 running_0001 触发):
1SELECT *
2FROM user_event_detail
3WHERE event_date = '2026-07-03'
4LIMIT 100;
分区表查询带上分区字段(避免 dynamic_0002 触发):
1SELECT city, count(*) AS cnt
2FROM user_event_detail
3WHERE event_date >= '2026-07-01'
4 AND event_date < '2026-07-04'
5GROUP BY city;
Join 查询必须包含明确 Join 条件(避免 static_0007 笛卡尔积拦截):
1SELECT a.user_id, a.event_type, b.name
2FROM user_event_detail a
3JOIN tb_primary_key b
4 ON a.user_id = b.user_id
5WHERE a.event_date = '2026-07-03';
不推荐 SQL(可能被拦截)
1-- ❌ 无过滤条件扫描大表(触发 running_0001/running_0004)
2SELECT * FROM user_event_detail;
3
4-- ❌ 无 Join 条件笛卡尔积(触发 static_0007)
5SELECT * FROM table_a, table_b;
6
7-- ❌ 无条件删除全表
8DELETE FROM user_event_detail;
9
10-- ❌ NOT IN 子查询(触发 static_0002)
11SELECT * FROM t WHERE id NOT IN (SELECT id FROM t2 WHERE status=0);
12
13-- ❌ 过多 COUNT(DISTINCT)(触发 static_0001)
14SELECT COUNT(DISTINCT a), COUNT(DISTINCT b), COUNT(DISTINCT c),
15 COUNT(DISTINCT d), COUNT(DISTINCT e), COUNT(DISTINCT f),
16 COUNT(DISTINCT g), COUNT(DISTINCT h), COUNT(DISTINCT i),
17 COUNT(DISTINCT j), COUNT(DISTINCT k)
18FROM big_table;
物化视图
物化视图适合对固定查询模式进行预计算加速,查询时 StarRocks 会自动路由到物化视图。
1-- 创建物化视图:按城市统计每日事件数
2CREATE MATERIALIZED VIEW mv_event_city_daily
3AS
4SELECT
5 event_date,
6 city,
7 count(*) AS event_count,
8 sum(amount) AS total_amount
9FROM user_event_detail
10GROUP BY event_date, city;
创建成功后,对 user_event_detail 按城市聚合的查询会自动命中物化视图加速。
说明:StarRocks 还支持异步物化视图(跨表、跨库),适合复杂数仓加速场景,详情参考 StarRocks 物化视图文档。
数据湖支持
StarRocks 支持通过 External Catalog 直接查询外部数据湖的数据,无需导入即可进行联邦查询。
支持的数据源类型(以实际版本支持为准):
- Hive Catalog(Hive Metastore / Glue)
- Iceberg Catalog
- Hudi Catalog
- Delta Lake Catalog
- BOS / S3 文件直查
1-- 查看已配置的 Catalog
2SHOW CATALOGS;
3
4-- 通过 Hive Catalog 查询外表
5SELECT * FROM hive_catalog.hive_db.hive_table LIMIT 10;
说明:数据湖查询能力需在集群创建时配置对应的 Catalog,具体支持情况以平台当前版本为准。
集群状态查看
1-- 查看 FE 节点状态(关注 Role、Alive、ReplayedJournalId)
2SHOW FRONTENDS;
3
4-- 查看 BE 节点状态(关注 Alive、DataUsedCapacity、MaxDiskUsedPct)
5SHOW BACKENDS;
6
7-- 查看 CN 节点状态(存算分离)
8SHOW COMPUTE NODES;
9
10-- 查看当前连接和正在执行的查询
11SHOW PROCESSLIST;
12
13-- 终止指定查询
14KILL QUERY <query_id>;
注意事项
- 生产集群建议开启服务高可用,并将 BE / CN 节点部署在 Core 节点上,以获得更好的性能和稳定性。
- 建议为 root 用户设置高复杂度密码并妥善保管;生产系统建议创建独立业务账号,不直接使用 root。
- 执行
DROP DATABASE/DROP TABLE后默认 1 天内可通过RECOVER命令恢复;若添加FORCE关键字,则直接删除且不可恢复,请谨慎使用。 - StarRocks 集群仅支持 VPC 网络访问,请确保客户端与集群处于同一 VPC 或已打通网络。
- 更多 SQL 语法与功能请参考 StarRocks 官方文档。
常见问题
Q:无法连接集群?
请检查:FE 地址是否正确;SQL 端口是否为 9030;安全组或白名单是否放通;用户名和密码是否正确;集群状态是否为运行中。
Q:查询响应很慢?
请检查:SQL 是否命中分区过滤条件;是否存在大表全表扫描;Join 条件是否合理;集群 BE/CN 资源是否不足。可通过 SHOW PROCESSLIST 查看正在执行的查询详情。
Q:Stream Load 导入失败?
请检查:目标库表是否存在;CSV 分隔符和列数是否与表结构一致;是否需要设置 skip_header;返回结果中的 ErrorURL 包含具体失败原因。
Q:SQL 被防御规则拦截?
根据拦截的规则 ID 调整 SQL:static_0007 → 检查 Join 条件;static_0001 → 减少 COUNT(DISTINCT) 用法;static_0002 → 将 NOT IN 改写为 NOT EXISTS 或 LEFT JOIN;running_0001 → 添加 LIMIT;dynamic_0002 → 添加分区过滤条件。如需执行高危 DDL/DML,请联系集群管理员确认后操作。
评价此篇文章
