StarRocks:高性能分析型数据仓库

文章目录

  • 一、简介
  • 二、使用入门
    • 1、docker安装
    • [2、数据库操作(和 MySQL 完全一致,无学习成本)](#2、数据库操作(和 MySQL 完全一致,无学习成本))
    • 3、表操作(核心差异点,重点掌握)
      • [(1)4 种表类型(新手必懂,选对表类型 = 成功一半)](#(1)4 种表类型(新手必懂,选对表类型 = 成功一半))
      • [(2)核心字段 / 关键字(和 MySQL 的差异点)](#(2)核心字段 / 关键字(和 MySQL 的差异点))
      • [(3)实战:创建明细表(Duplicate Key,日志场景)](#(3)实战:创建明细表(Duplicate Key,日志场景))
      • [(4)实战:创建主键表(Primary Key,订单详情场景,支持 UPDATE/DELETE)](#(4)实战:创建主键表(Primary Key,订单详情场景,支持 UPDATE/DELETE))
      • (5)实战:其他表操作(和mysql一致)
    • 4、数据操作
      • [(1)插入数据(INSERT INTO,测试用,大批量不推荐)](#(1)插入数据(INSERT INTO,测试用,大批量不推荐))
      • [(2)大批量数据加载(STREAM LOAD,Java 对接常用)](#(2)大批量数据加载(STREAM LOAD,Java 对接常用))
      • [(3)查询操作(SELECT,和 MySQL 高度一致)](#(3)查询操作(SELECT,和 MySQL 高度一致))
    • 5、java对接

一、简介

1、简介

官方文档:https://docs.starrocks.io/zh/docs/introduction/StarRocks_intro/

StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库。StarRocks 的愿景是能够让用户的数据分析变得更加简单和敏捷。用户无需经过复杂的预处理,就可以用 StarRocks 来支持多种数据分析场景的极速分析。

StarRocks 兼容 MySQL 协议,支持标准 SQL 语法,易于对接使用,全系统无外部依赖,高可用,易于运维管理。StarRocks 还兼容多种主流 BI 产品,包括 Tableau、Power BI、QuickBI、FineBI 和 Smartbi。

2、术语

FE

FE 节点负责元数据管理、客户端连接管理、查询计划和查询调度。每个 FE 在其内存中存储和维护完整的元数据副本,确保每个 FE 都能提供无差别的服务。默认端口9030(MySQL 协议连接端口)、8030(HTTP 端口)。

CN

CN 节点在存算分离或存算一体集群中负责执行查询。

BE

BE 节点在存算一体集群中负责数据存储和执行查询。默认端口9040。

二、使用入门

1、docker安装

bash 复制代码
# 大概4个G
docker run -p 9030:9030 -p 8030:8030 -p 8040:8040 -itd --name starrocks starrocks/allin1-ubuntu

文档:https://docs.starrocks.io/zh/docs/3.5/quick_start/shared-nothing/

注意!正式环境推荐使用二进制包部署!

连接方式和mysql是一样的,但是建表语句有所不同。

默认连接端口是9030 ,用户名是root,无密码。

sql 复制代码
-- 查看版本,本次使用最新版4.0.5-000efef
SHOW VARIABLES LIKE '%version%';

2、数据库操作(和 MySQL 完全一致,无学习成本)

sql 复制代码
-- 1. 创建数据库(指定字符集,避免中文乱码)
CREATE DATABASE IF NOT EXISTS starrocks_demo 
DEFAULT CHARACTER SET utf8mb4 
DEFAULT COLLATE utf8mb4_general_ci;

-- 2. 切换数据库
USE starrocks_demo;

-- 3. 查看所有数据库
SHOW DATABASES;

-- 4. 删除数据库(谨慎操作,会删除所有表)
DROP DATABASE IF EXISTS starrocks_demo;

3、表操作(核心差异点,重点掌握)

StarRocks 的表设计是性能优化的核心,和 MySQL 的「行式存储、普通索引」不同,它采用「列式存储、排序键 / 分区键 / 分桶键」优化查询,且支持 4 种表类型,需根据场景选择。

(1)4 种表类型(新手必懂,选对表类型 = 成功一半)

表类型 核心特点 适用场景 是否支持 UPDATE/DELETE
明细表(Duplicate Key) 存储完整明细数据,无聚合,保留所有记录 日志查询、原始数据明细检索(如用户操作日志) 不支持(仅支持批量删除)
聚合表(Aggregate Key) 导入时自动聚合数据,保留聚合结果,节省存储 统计报表、多维聚合分析(如销售数据汇总) 不支持
更新表(Unique Key) 支持部分字段更新,按唯一键去重,最终保留最新记录 需要更新单条数据的场景(如用户账户信息) 支持(批量更新更高效)
主键表(Primary Key) 基于主键的行存表,支持高效点查和实时更新 高并发点查、实时更新(如订单详情查询) 支持(性能最优)

(2)核心字段 / 关键字(和 MySQL 的差异点)

排序键(ORDER BY):指定表的排序字段,列式存储按该字段排序,查询时可快速裁剪数据,必须放在字段定义的最前面,优先选择查询频繁的过滤、分组字段。
分区键(PARTITION BY):将数据按分区拆分(如按时间),查询时可只扫描目标分区(分区裁剪),大幅提升查询效率,常用RANGE分区(按时间、数值)。
分桶键(DISTRIBUTED BY HASH):将每个分区的数据按哈希值拆分到不同 BE 节点,避免单节点数据过多,提升并行查询效率,选择高基数字段(如用户 ID、订单 ID)。
字段类型:兼容 MySQL 大部分字段类型,推荐优先使用更紧凑的类型(节省存储,提升查询速度),如TINYINT代替INT、VARCHAR(n)代替TEXT、DATE/DATETIME代替VARCHAR存储时间。

(3)实战:创建明细表(Duplicate Key,日志场景)

sql 复制代码
-- 创建用户操作日志表(明细表)
CREATE TABLE IF NOT EXISTS user_operation_log (
    -- 排序键(ORDER BY):必须放在前面,选择查询频繁的字段
    operation_time DATETIME NOT NULL COMMENT '操作时间',
    user_id BIGINT NOT NULL COMMENT '用户ID',
    operation_type VARCHAR(32) NOT NULL COMMENT '操作类型(登录/注册/下单)',
    operation_ip VARCHAR(64) COMMENT '操作IP',
    operation_content TEXT COMMENT '操作内容'
)
-- 表类型:明细表(Duplicate Key),指定排序键(和ORDER BY一致)
DUPLICATE KEY(operation_time, user_id)
-- 分区键:按天分区(RANGE分区,适合时间序列数据)
PARTITION BY RANGE(operation_time) (
    PARTITION p20260201 VALUES LESS THAN ('2026-02-02'),
    PARTITION p20260202 VALUES LESS THAN ('2026-02-03'),
    PARTITION p20260203 VALUES LESS THAN ('2026-02-04')
)
-- 分桶键:按user_id哈希分桶,分桶数(建议等于BE节点数的1-3倍,单节点填1)
DISTRIBUTED BY HASH(user_id) BUCKETS 1
-- 存储属性(新手默认即可)
PROPERTIES (
    "storage_medium" = "HDD",
    "replication_num" = "1"
);

(4)实战:创建主键表(Primary Key,订单详情场景,支持 UPDATE/DELETE)

自 3.0 版本起,主键表解耦了排序键与主键,支持单独指定排序键,提供更灵活的建表能力。

自 3.1 版本起,存算分离模式支持创建主键表

自 3.1.4 版本起,支持持久化主键索引至本地磁盘。

自 3.3.2 版本起,支持持久化主键索引至对象存储。

sql 复制代码
-- 创建用户信息表(主键表)
CREATE TABLE IF NOT EXISTS user_info (
    -- 主键(PRIMARY KEY):唯一标识,支持点查和更新
    user_id BIGINT NOT NULL COMMENT '用户ID',
    user_name VARCHAR(64) NOT NULL COMMENT '用户名',
    age TINYINT COMMENT '年龄',
    phone VARCHAR(16) COMMENT '手机号',
    create_time DATETIME NOT NULL COMMENT '创建时间',
    update_time DATETIME NOT NULL COMMENT '更新时间'
)
-- 表类型:主键表(Primary Key),指定排序键(建议和主键一致或包含查询字段)
PRIMARY KEY (user_id)
-- 分桶键:按user_id哈希分桶(主键表建议分区键和主键一致)
DISTRIBUTED BY HASH(user_id)
ORDER BY (user_id)
-- 存储属性(新手默认即可)
PROPERTIES (
    "storage_medium" = "HDD",
    "replication_num" = "1",
    -- 主键表支持实时更新(默认开启)
    "enable_persistent_index" = "true"
);

(5)实战:其他表操作(和mysql一致)

sql 复制代码
-- 1. 查看当前数据库所有表
SHOW TABLES;

-- 2. 查看表结构(desc/describe均可)
DESC user_operation_log;

-- 3. 修改表(添加字段,新手常用)
ALTER TABLE user_info ADD COLUMN email VARCHAR(128) COMMENT '邮箱' AFTER phone;

-- 4. 删除表(谨慎操作)
DROP TABLE IF EXISTS user_operation_log;

-- 5. 清空表数据(明细表/主键表均支持,快速清空,不可恢复)
TRUNCATE TABLE user_info;

4、数据操作

StarRocks 的数据加载和 MySQL 差异较大,INSERT INTO仅适合测试(单条 / 少量数据),大批量数据推荐使用STREAM LOAD(HTTP 接口)、BROKER LOAD(对接 HDFS)等。

(1)插入数据(INSERT INTO,测试用,大批量不推荐)

sql 复制代码
-- 1. 单条插入(明细表)
INSERT INTO user_operation_log 
(operation_time, user_id, operation_type, operation_ip, operation_content)
VALUES 
('2026-02-03 10:00:00', 1001, 'login', '127.0.0.1', '用户登录成功');

-- 2. 批量插入(推荐,比单条插入高效)
INSERT INTO user_operation_log 
(operation_time, user_id, operation_type, operation_ip, operation_content)
VALUES 
('2026-02-03 10:05:00', 1001, 'order', '127.0.0.1', '用户下单成功'),
('2026-02-03 10:10:00', 1002, 'register', '192.168.1.1', '用户注册成功');

-- 3. 主键表插入(和明细表一致)
INSERT INTO user_info 
(user_id, user_name, age, phone, create_time, update_time)
VALUES 
(1001, '张三', 25, '13800138000', '2026-02-03 09:00:00', '2026-02-03 09:00:00');

(2)大批量数据加载(STREAM LOAD,Java 对接常用)

STREAM LOAD是 StarRocks 推荐的大批量数据导入方式,基于 HTTP 接口,支持批量导入 JSON/CSV 格式数据,原子性导入(要么全部成功,要么全部失败),效率远高于INSERT INTO。

支持批量导入,单批次可导入 GB 级数据。

兼容 JSON/CSV 格式,Java 程序可直接构造数据发送。

有导入限流、重试机制,保证数据一致性。

bash 复制代码
# 导入CSV格式数据到user_operation_log表
curl -X PUT \
-H "Authorization: Basic cm9vdDp0ZXN0" \ # 认证信息:root:test(base64编码,默认root无密码,填cm9vdDpoYXNo)
-H "Content-Type: text/csv" \
-H "label: load_log_20260203" \ # 导入标签,唯一标识本次导入,用于去重和查询状态
--data-binary @/tmp/user_log.csv \ # 本地CSV文件路径
http://127.0.0.1:8030/api/starrocks_demo/user_operation_log/_stream_load

# CSV 文件格式(/tmp/user_log.csv)
2026-02-03 14:00:00,1003,pay,192.168.1.2,用户支付成功
2026-02-03 14:05:00,1004,logout,192.168.1.3,用户退出登录

(3)查询操作(SELECT,和 MySQL 高度一致)

StarRocks 的查询语法和 MySQL 基本一致,支持WHERE、GROUP BY、JOIN、ORDER BY、LIMIT、窗口函数、CTE 等,新手可直接复用 MySQL 的查询经验。

sql 复制代码
-- 1. 简单查询(明细查询)
SELECT * FROM user_operation_log 
WHERE operation_time >= '2026-02-03 10:00:00' 
AND user_id = 1001;

-- 2. 聚合查询(统计每个用户的操作次数)
SELECT user_id, COUNT(*) AS operation_count 
FROM user_operation_log 
GROUP BY user_id 
ORDER BY operation_count DESC 
LIMIT 10;

-- 3. JOIN查询(关联用户信息和操作日志)
SELECT u.user_name, l.operation_type, l.operation_time 
FROM user_info u
JOIN user_operation_log l ON u.user_id = l.user_id
WHERE u.user_id = 1001;

-- 4. 窗口函数(查询每个用户的最新操作记录,新手可选学)
SELECT user_id, operation_time, operation_type,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY operation_time DESC) AS rn
FROM user_operation_log
HAVING rn = 1;

5、java对接

与mysql一致,使用的驱动也是mysql的即可。

相关推荐
geovindu17 小时前
SQL Data Sampling and Approximation Techniques using postgreSQL 18
大数据·数据库·数据仓库·sql·postgresql·数据库开发·数据库架构
程序员梅雨2 天前
【从零开始学习数据仓库 | 第一篇】:维度建模理论
大数据·数据仓库·学习·阿里云·数据分析
棣廷2 天前
初识数据仓库——数仓分层到DataX数据采集
数据仓库
棣廷2 天前
初识Hive(2)
数据仓库·hive·hadoop
geovindu3 天前
Pivoting and Unpivoting Data in SQL using postgreSQL 18
大数据·数据库·数据仓库·sql·postgresql·数据库开发·数据库架构
数据库小学妹3 天前
OLAP数据库怎么选?看清OLTP、数仓、湖仓边界
数据仓库·mpp·列式存储·联机分析处理·数据库选型·olap数据库
程序 代码狂人3 天前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
天河归来3 天前
从原始消息到业务数据:三层数据架构的设计与实践
数据库·数据仓库·架构
注塑机数据采集联网5 天前
中科晟达注塑机 MES 系统:从车间到数字化的智能制造实践
大数据·数据仓库·人工智能·物联网·制造·数据库架构