禅与计算机 禅与计算机
首页
  • Java基础

    • 聊一聊java一些核心知识点
    • 聊聊java面向对象核心知识点
    • 聊聊Java中的异常
    • 聊聊Java中的常用类String
    • 万字长文带你细聊Java注解本质
    • 来聊聊Java的反射机制
    • 深入解析Java泛型的魅力与机制
    • Java集合框架深度解析与面试指南
    • Java常用集合类HashMap深度解析
    • LinkedHashMap源码到面试题的全解析
    • 深入解析CopyOnWriteArrayList的工作机制
    • Java基础IO总结
    • Java三大IO模型小结
    • Java BIO NIO AIO详解
    • Java进阶NIO之IO多路复用详解
    • Java8流式编程入门
    • 一文速通lambda与函数式编程
    • Java8函数式方法引用最佳实践
  • Java并发编程

    • Java并发编程基础小结
    • 深入理解Java中的final关键字
    • 浅谈Java并发安全发布技术
    • 浅谈Java并发编程中断的哲学
    • Java线程池知识点小结
    • 浅谈Java线程池中拒绝策略与流控的艺术
    • synchronized关键字使用指南
    • 深入源码解析synchronized关键字
    • 详解JUC包下的锁
    • 详解并发编程中的CAS原子类
    • LongAdder源码分析
    • AQS源码解析
    • 深入剖析Java并发编程中的死锁问题
    • Java并发容器总结
    • 详解Java并发编程volatile关键字
    • 并发编程ThreadLocal必知必会
    • CompletableFuture基础实践小结
    • CompletableFuture异步多任务最佳实践
    • 硬核详解FutureTask设计与实现
    • 线程池大小设置的底层逻辑与场景化方案
    • 来聊一个有趣的限流器RateLimiter
  • JVM相关

    • 从零开始掌握 JVM
    • JVM核心知识点小结
    • JVM指令集概览:基础与应用
    • JVM类加载器深度解析
    • JVM方法区深度解析
    • Java内存模型JMM详解
    • Java对象大小的精确计算方法
    • 逃逸分析在Java中的应用与优化
    • 从零开始理解JVM的JIT编译机制
    • G1垃圾回收器:原理详解与调优指南
    • JVM故障排查实战指南
    • JVM内存问题排错最佳实践
    • JVM内存溢出排查指南
    • 简明的Arthas使用教程
    • 简明的Arthas配置及基础运维教程
    • 基于Arthas Idea的JVM故障排查与指令生成
    • 基于arthas量化监控诊断java应用方法论与实践
    • 深入剖析arthas技术原理
  • 深入理解Spring框架

    • Spring 核心知识点全面解析
    • Spring核心功能IOC详解
    • Spring AOP 深度剖析与实践
    • Spring 三级缓存机制深度解析
    • 深入 Spring 源码,剖析设计模式的落地实践
    • 探索 Spring 事务的奥秘
    • 深入解析Spring Bean的生命周期管理
    • 解读 Spring Boot 核心知识点
    • Spring Boot 启动优化实战:1分钟到13秒的排查与优化之路
    • Spring Boot自动装配原理及实践
    • 一文快速上手Sharding-JDBC
    • sharding-jdbc如何实现分页查询
    • 基于DynamicDataSource整合分库分表框架Shardingsphere
  • 计算机组成原理

    • 计算机硬件知识小结
    • CPU核心知识点小结
    • 浅谈CPU流水线的艺术
    • 从Java程序员视角聊聊CPU缓存
    • CPU任务调度和伪共享问题小结
    • CPU MESI缓存一致性协议
    • CPU内存管理机制
    • 内存深度解析
    • 磁盘存储原理
    • 详解计算机启动步骤
    • CPU南北桥架构与发展史
    • CPU中断机制与硬件交互详解
  • 操作系统

    • 如何实现一个高性能服务器
    • Linux文件结构与文件权限
    • Linux常见压缩指令小结
    • Linux核心系统调用详解
    • Linux进程管理
    • Linux线程管理
    • 进程与线程深度解析
    • Linux进程间通信机制
    • 零拷贝技术原理与实践
    • CPU缓存一致性问题深度解析
    • IO任务与CPU调度艺术
  • 计算机网络

    • 网卡通信原理详解
    • 网卡数据包处理指南
    • 基于抓包详解TCP协议
  • 编码最佳实践

    • 浅谈现代软件工程TDD最佳实践
    • 浅谈TDD模式下并发程序设计与实现
    • 面向AI编程新范式Trae后端开发环境搭建与实践
    • 基于提示词工程的Redis签到功能开发实践
    • 基于Vibe Coding的Redis分页查询实现
    • 告别AI无效对话:资深工程师的提示词设计最佳实践
  • 实用技巧与配置

    • Mac常用快捷键与效率插件指南
    • Keynote技术科普短视频制作全攻略
  • 写作

    • 写好技术博客的5大核心原则:从认知科学到AI工具的全流程指南
  • 开发工具

    • IDEA配置详解与高效使用指南
  • Nodejs
  • 博客搭建
  • Redis

    • Redis核心知识小结
    • 解锁Redis发布订阅模式
    • 掌握Redis事务
    • Redis主从复制技术
    • Redis的哨兵模式详解
    • 深度剖析Redisson分布式锁
    • 详解redis单线程设计思路
    • 来聊聊Redis所实现的Reactor模型
    • Redis RDB持久化源码深度解析
    • 来聊聊redis的AOF写入
    • 来聊聊Redis持久化AOF管道通信的设计
    • 来聊聊redis集群数据迁移
    • Redis SDS动态字符串深度解析
    • 高效索引的秘密:redis跳表设计与实现
    • 聊聊redis中的字典设计与实现
  • MySQL

    • MySQL基础知识点小结
    • 解读MySQL 索引基础
    • MySQL 索引进阶指南
    • 解读MySQL Explain关键字
    • 探秘 MySQL 锁:原理与实践
    • 详解MySQL重做日志redolog
    • 详解undoLog在MySQL MVCC中的运用
    • MySQL二进制日志binlog核心知识点
    • MySQL高效插入数据的最佳实践
    • MySQL分页查询优化指南
    • MySQL流式查询的奥秘与应用解析
    • 来聊聊分库分表
    • 来聊聊大厂常用的分布式ID生成方案
  • ElasticSearch

    • 从Lucene到Elasticsearch:进化之路
    • ES 基础使用指南
    • ElasticSearch如何写入一篇文档
    • 深入剖析Elasticsearch文档读取原理
    • 聊聊ElasticSearch性能调优
    • Spring借助Easy-Es操作ES
  • Netty

    • 一文快速了解高性能网络通信框架Netty
    • Netty网络传输简记
    • 来聊聊Netty的ByteBuf
    • 来聊聊Netty消息发送的那些事
    • 解密Netty高性能之谜:NioEventLoop线程池阻塞分析
    • 详解Netty中的责任链Pipeline如何管理ChannelHandler
    • Netty Reactor模型常见知识点小结
    • Netty如何驾驭TCP流式传输?粘包拆包问题全解
    • Netty解码器源码解析
  • 消息队列

    • 一文快速入门消息队列
    • 消息队列RocketMQ入门指南
    • 基于RocketMQ实现分布式事务
    • RocketMQ容器化最佳实践
    • RocketMQ常见问题与深度解析
    • Kafka快速安装与使用指南
  • Nginx

    • Linux下的nginx安装
    • Nginx基础入门总结
    • Nginx核心指令小结
    • Nginx进程结构与核心模块初探
    • Nginx应用进阶HTTP核心模块配置
    • Nginx缓存及HTTPS配置小记
    • nginx高可用实践简记
    • Nginx性能优化
  • 微服务基础

    • 微服务基础知识小结
    • 分布式事务核心概念小结
    • OpenFeign核心知识小结
    • 微服务组件Gateway核心使用小结
    • 分布式事务Seata实践
    • 用 Docker Compose 完成 Seata 的整合部署
  • Nacos

    • Nacos服务注册原理全解析
    • Nacos服务订阅流程全解析
    • Nacos服务变更推送流程全解析
    • 深入解析SpringCloud负载均衡器Loadbalancer
    • Nacos源码环境搭建与调试指南
  • Seata

    • 深度剖析Seata源码
  • Docker部署

    • 一文快速掌握docker的理念和基本使用
    • 使用docker编排容器
    • 基于docker-compose部署微服务基本环境
    • 基于docker容器化部署微服务
    • Gateway全局异常处理及请求响应监控
    • Docker图形化界面工具Portainer最佳实践
  • Go基础

    • 一文带你速通Go语言基础语法
    • 一文快速掌握Go语言切片
    • 来聊聊go语言的hashMap
    • 一文速通go语言类型系统
    • 浅谈Go语言中的面向对象
    • go语言是如何实现协程的
    • 聊聊go语言中的GMP模型
    • 极简的go语言channel入门
    • 聊聊go语言基于epoll的网络并发实现
    • 写给Java开发的Go语言协程实践
  • mini-redis实战

    • 来聊聊我用go手写redis这件事
    • mini-redis如何解析处理客户端请求
    • 实现mini-redis字符串操作
    • 硬核复刻redis底层双向链表核心实现
    • 动手复刻redis之go语言下的字典的设计与落地
    • Go 语言下的 Redis 跳表设计与实现
    • Go 语言版 Redis 有序集合指令复刻探索
  • 项目编排

    • Spring脚手架创建简记
    • Spring脚手架集成分页插件
    • Spring脚手架集成校验框架
    • maven父子模块两种搭建方式简记
    • SpringBoot+Vue3前后端快速整合入门
    • 来聊聊Java项目分层规范
  • 场景设计

    • Java实现文件分片上传
    • 基于时间缓存优化浏览器轮询阻塞问题
    • 基于EasyExcel实现高效导出
    • 10亿数据高效插入MySQL最佳方案
    • 从开源框架中学习那些实用的位运算技巧
  • CI/CD

    • 基于NETAPP实现内网穿透
    • 基于Gitee实现Jenkins自动化部署SpringBoot项目
    • Jenkins离线安装部署教程简记
    • 基于Nexus搭建Maven私服基础入门
    • 基于内网的Jenkins整合gitlab综合方案简记
  • 监控方法论

    • SpringBoot集成Prometheus与Grafana监控
    • Java监控度量Micrometer全解析
    • 从 micrometer计量器角度快速上手promQL
    • 硬核安利一个监控告警开源项目Nightingale
  • Spring AI

    • Spring AI Alibaba深度实战:一文掌握智能体开发全流程
    • Spring AI Alibaba实战:JVM监控诊断Arthas Agent的工程化构建与最佳实践
  • 大模型评测

    • M2.7 真能打!我用两个真实场景测了测,结果有点意外
    • Qoder JetBrains插件评测:祖传代码重构与接口优化实战
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

sharkchili

计算机禅修者
首页
  • Java基础

    • 聊一聊java一些核心知识点
    • 聊聊java面向对象核心知识点
    • 聊聊Java中的异常
    • 聊聊Java中的常用类String
    • 万字长文带你细聊Java注解本质
    • 来聊聊Java的反射机制
    • 深入解析Java泛型的魅力与机制
    • Java集合框架深度解析与面试指南
    • Java常用集合类HashMap深度解析
    • LinkedHashMap源码到面试题的全解析
    • 深入解析CopyOnWriteArrayList的工作机制
    • Java基础IO总结
    • Java三大IO模型小结
    • Java BIO NIO AIO详解
    • Java进阶NIO之IO多路复用详解
    • Java8流式编程入门
    • 一文速通lambda与函数式编程
    • Java8函数式方法引用最佳实践
  • Java并发编程

    • Java并发编程基础小结
    • 深入理解Java中的final关键字
    • 浅谈Java并发安全发布技术
    • 浅谈Java并发编程中断的哲学
    • Java线程池知识点小结
    • 浅谈Java线程池中拒绝策略与流控的艺术
    • synchronized关键字使用指南
    • 深入源码解析synchronized关键字
    • 详解JUC包下的锁
    • 详解并发编程中的CAS原子类
    • LongAdder源码分析
    • AQS源码解析
    • 深入剖析Java并发编程中的死锁问题
    • Java并发容器总结
    • 详解Java并发编程volatile关键字
    • 并发编程ThreadLocal必知必会
    • CompletableFuture基础实践小结
    • CompletableFuture异步多任务最佳实践
    • 硬核详解FutureTask设计与实现
    • 线程池大小设置的底层逻辑与场景化方案
    • 来聊一个有趣的限流器RateLimiter
  • JVM相关

    • 从零开始掌握 JVM
    • JVM核心知识点小结
    • JVM指令集概览:基础与应用
    • JVM类加载器深度解析
    • JVM方法区深度解析
    • Java内存模型JMM详解
    • Java对象大小的精确计算方法
    • 逃逸分析在Java中的应用与优化
    • 从零开始理解JVM的JIT编译机制
    • G1垃圾回收器:原理详解与调优指南
    • JVM故障排查实战指南
    • JVM内存问题排错最佳实践
    • JVM内存溢出排查指南
    • 简明的Arthas使用教程
    • 简明的Arthas配置及基础运维教程
    • 基于Arthas Idea的JVM故障排查与指令生成
    • 基于arthas量化监控诊断java应用方法论与实践
    • 深入剖析arthas技术原理
  • 深入理解Spring框架

    • Spring 核心知识点全面解析
    • Spring核心功能IOC详解
    • Spring AOP 深度剖析与实践
    • Spring 三级缓存机制深度解析
    • 深入 Spring 源码,剖析设计模式的落地实践
    • 探索 Spring 事务的奥秘
    • 深入解析Spring Bean的生命周期管理
    • 解读 Spring Boot 核心知识点
    • Spring Boot 启动优化实战:1分钟到13秒的排查与优化之路
    • Spring Boot自动装配原理及实践
    • 一文快速上手Sharding-JDBC
    • sharding-jdbc如何实现分页查询
    • 基于DynamicDataSource整合分库分表框架Shardingsphere
  • 计算机组成原理

    • 计算机硬件知识小结
    • CPU核心知识点小结
    • 浅谈CPU流水线的艺术
    • 从Java程序员视角聊聊CPU缓存
    • CPU任务调度和伪共享问题小结
    • CPU MESI缓存一致性协议
    • CPU内存管理机制
    • 内存深度解析
    • 磁盘存储原理
    • 详解计算机启动步骤
    • CPU南北桥架构与发展史
    • CPU中断机制与硬件交互详解
  • 操作系统

    • 如何实现一个高性能服务器
    • Linux文件结构与文件权限
    • Linux常见压缩指令小结
    • Linux核心系统调用详解
    • Linux进程管理
    • Linux线程管理
    • 进程与线程深度解析
    • Linux进程间通信机制
    • 零拷贝技术原理与实践
    • CPU缓存一致性问题深度解析
    • IO任务与CPU调度艺术
  • 计算机网络

    • 网卡通信原理详解
    • 网卡数据包处理指南
    • 基于抓包详解TCP协议
  • 编码最佳实践

    • 浅谈现代软件工程TDD最佳实践
    • 浅谈TDD模式下并发程序设计与实现
    • 面向AI编程新范式Trae后端开发环境搭建与实践
    • 基于提示词工程的Redis签到功能开发实践
    • 基于Vibe Coding的Redis分页查询实现
    • 告别AI无效对话:资深工程师的提示词设计最佳实践
  • 实用技巧与配置

    • Mac常用快捷键与效率插件指南
    • Keynote技术科普短视频制作全攻略
  • 写作

    • 写好技术博客的5大核心原则:从认知科学到AI工具的全流程指南
  • 开发工具

    • IDEA配置详解与高效使用指南
  • Nodejs
  • 博客搭建
  • Redis

    • Redis核心知识小结
    • 解锁Redis发布订阅模式
    • 掌握Redis事务
    • Redis主从复制技术
    • Redis的哨兵模式详解
    • 深度剖析Redisson分布式锁
    • 详解redis单线程设计思路
    • 来聊聊Redis所实现的Reactor模型
    • Redis RDB持久化源码深度解析
    • 来聊聊redis的AOF写入
    • 来聊聊Redis持久化AOF管道通信的设计
    • 来聊聊redis集群数据迁移
    • Redis SDS动态字符串深度解析
    • 高效索引的秘密:redis跳表设计与实现
    • 聊聊redis中的字典设计与实现
  • MySQL

    • MySQL基础知识点小结
    • 解读MySQL 索引基础
    • MySQL 索引进阶指南
    • 解读MySQL Explain关键字
    • 探秘 MySQL 锁:原理与实践
    • 详解MySQL重做日志redolog
    • 详解undoLog在MySQL MVCC中的运用
    • MySQL二进制日志binlog核心知识点
    • MySQL高效插入数据的最佳实践
    • MySQL分页查询优化指南
    • MySQL流式查询的奥秘与应用解析
    • 来聊聊分库分表
    • 来聊聊大厂常用的分布式ID生成方案
  • ElasticSearch

    • 从Lucene到Elasticsearch:进化之路
    • ES 基础使用指南
    • ElasticSearch如何写入一篇文档
    • 深入剖析Elasticsearch文档读取原理
    • 聊聊ElasticSearch性能调优
    • Spring借助Easy-Es操作ES
  • Netty

    • 一文快速了解高性能网络通信框架Netty
    • Netty网络传输简记
    • 来聊聊Netty的ByteBuf
    • 来聊聊Netty消息发送的那些事
    • 解密Netty高性能之谜:NioEventLoop线程池阻塞分析
    • 详解Netty中的责任链Pipeline如何管理ChannelHandler
    • Netty Reactor模型常见知识点小结
    • Netty如何驾驭TCP流式传输?粘包拆包问题全解
    • Netty解码器源码解析
  • 消息队列

    • 一文快速入门消息队列
    • 消息队列RocketMQ入门指南
    • 基于RocketMQ实现分布式事务
    • RocketMQ容器化最佳实践
    • RocketMQ常见问题与深度解析
    • Kafka快速安装与使用指南
  • Nginx

    • Linux下的nginx安装
    • Nginx基础入门总结
    • Nginx核心指令小结
    • Nginx进程结构与核心模块初探
    • Nginx应用进阶HTTP核心模块配置
    • Nginx缓存及HTTPS配置小记
    • nginx高可用实践简记
    • Nginx性能优化
  • 微服务基础

    • 微服务基础知识小结
    • 分布式事务核心概念小结
    • OpenFeign核心知识小结
    • 微服务组件Gateway核心使用小结
    • 分布式事务Seata实践
    • 用 Docker Compose 完成 Seata 的整合部署
  • Nacos

    • Nacos服务注册原理全解析
    • Nacos服务订阅流程全解析
    • Nacos服务变更推送流程全解析
    • 深入解析SpringCloud负载均衡器Loadbalancer
    • Nacos源码环境搭建与调试指南
  • Seata

    • 深度剖析Seata源码
  • Docker部署

    • 一文快速掌握docker的理念和基本使用
    • 使用docker编排容器
    • 基于docker-compose部署微服务基本环境
    • 基于docker容器化部署微服务
    • Gateway全局异常处理及请求响应监控
    • Docker图形化界面工具Portainer最佳实践
  • Go基础

    • 一文带你速通Go语言基础语法
    • 一文快速掌握Go语言切片
    • 来聊聊go语言的hashMap
    • 一文速通go语言类型系统
    • 浅谈Go语言中的面向对象
    • go语言是如何实现协程的
    • 聊聊go语言中的GMP模型
    • 极简的go语言channel入门
    • 聊聊go语言基于epoll的网络并发实现
    • 写给Java开发的Go语言协程实践
  • mini-redis实战

    • 来聊聊我用go手写redis这件事
    • mini-redis如何解析处理客户端请求
    • 实现mini-redis字符串操作
    • 硬核复刻redis底层双向链表核心实现
    • 动手复刻redis之go语言下的字典的设计与落地
    • Go 语言下的 Redis 跳表设计与实现
    • Go 语言版 Redis 有序集合指令复刻探索
  • 项目编排

    • Spring脚手架创建简记
    • Spring脚手架集成分页插件
    • Spring脚手架集成校验框架
    • maven父子模块两种搭建方式简记
    • SpringBoot+Vue3前后端快速整合入门
    • 来聊聊Java项目分层规范
  • 场景设计

    • Java实现文件分片上传
    • 基于时间缓存优化浏览器轮询阻塞问题
    • 基于EasyExcel实现高效导出
    • 10亿数据高效插入MySQL最佳方案
    • 从开源框架中学习那些实用的位运算技巧
  • CI/CD

    • 基于NETAPP实现内网穿透
    • 基于Gitee实现Jenkins自动化部署SpringBoot项目
    • Jenkins离线安装部署教程简记
    • 基于Nexus搭建Maven私服基础入门
    • 基于内网的Jenkins整合gitlab综合方案简记
  • 监控方法论

    • SpringBoot集成Prometheus与Grafana监控
    • Java监控度量Micrometer全解析
    • 从 micrometer计量器角度快速上手promQL
    • 硬核安利一个监控告警开源项目Nightingale
  • Spring AI

    • Spring AI Alibaba深度实战:一文掌握智能体开发全流程
    • Spring AI Alibaba实战:JVM监控诊断Arthas Agent的工程化构建与最佳实践
  • 大模型评测

    • M2.7 真能打!我用两个真实场景测了测,结果有点意外
    • Qoder JetBrains插件评测:祖传代码重构与接口优化实战
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Redis

  • MySQL

  • ElasticSearch

  • StarRocks

    • StarRocks基础入门指南
      • 写在文章开头
      • SR基本介绍
      • starrocks架构介绍
        • 基本概念
        • 存算一体
        • 存算分离
      • 更多关于StarRocks
        • CBO优化器
        • 实时更新列
        • 智能物化视图
      • 小结
      • 参考
  • 数据库
  • StarRocks
sharkchili
2026-03-25
目录

StarRocks基础入门指南

[toc]

# 写在文章开头

本文将针对starrocks(后续简称为sr)基本概念和架构设计等理念展开介绍,希望对具有OLAP需求的数据库使用者有所启发。

我是 SharkChili,Java 开发者,Java Guide开源项目维护者。欢迎关注我的公众号:写代码的SharkChili,也欢迎您了解我的开源项目 mini-redis:https://github.com/shark-ctrl/mini-redis。

为方便与读者交流,现已创建读者群。关注上方公众号获取我的联系方式,添加时备注加群即可加入。

# SR基本介绍

作为一款新型的OLAP类型数据库,sr利用MPP(Massively Parallel Processing)框架,即大规模并行处理数据库,它通过数据和处理任务分布在多服务节点并行处理各自子单元,最大化的利用各个节点的CPU和IO资源,同时该结构还支持灵活的水平拓展且可以保证线性的性能增长,所以在框架设计层面,SR的具备着如下几个优势:

  1. 高性能:可快速处理TB、PB级别的数据
  2. 高可用:分布式节点可灵活调整
  3. 高扩展:分布式算法保证灵活的水平拓展,且单机故障不会导致整个系统瘫痪
  4. 适合复杂分析:最大化利用各个节点资源,保证高效处理任务

同时,SR采用向量化存储引擎,即针对数据采用列式存储的方式组织数据,即一条完整的元用户数据,会拆分成不同的列进行组织,例如我们现在有一条数据电子产品,3000,手机,在传统OLTP例如mysql数据库上,它是将整条数据以二进制数据的方式写入到指定页上。而SR则是以列式存储的方式将列别、价格、产品名称拆分写入到每个列的数据行上:

sr.drawio

因为向量化存储的方式,所以sr在数据编排组织管理上也有着如下的优势:

  1. 列示存储保证支持批量大数据写入,相同类型数据写入指令CPU可以直接通过SIMD的方式批量写入
  2. 查询时可以利用CPU局部性一次性检索出最相关数据,这一点对于OLAP报表分析极具优势
  3. 最后一点是延迟查询聚合,传统数据的select 名称 from tb where type=电子产品 and price>5000 必须一次性读取单条数据的所有行才能进行进一步的筛选并返回给用户,而sr对应的执行步骤是先通过类型列找到电子产品的列,例如本文就是索引0,基于该索引生成bit到价格列进行进一步筛选,最终得到一个符合要求的bitmap,需要返回结果给用户时,基于这个bitmap找到名称列数据写回给用户。

sr-2.drawio

这使得sr进行查询时可以做到:

  1. 最小化IO
  2. CPU缓存友好
  3. 向量化处理利用SIMD指令完成高效检索

正是因为这些优势,使得用户可以灵活的选择设计雪花模型、星型模型这种多表联查亦或者宽表模型或者聚合模型等表结构,灵活的配置多维报表分析,业务场景包含:

  1. 用户行为分析
  2. 用户画像
  3. 业务指标报表
  4. 自助式报表平台
  5. 系统监控分析

同时,sr也设计了主键表,即支持各种TP(Transaction Processing)型数据库的秒级处理,所以常应用于:

  1. 电商促销数据分析
  2. 金融行业绩效分析
  3. 物流行业运单分析

# starrocks架构介绍

# 基本概念

SR的架构相对简洁明了,可直接分为前端和后端,前端节点称为FE,后端按照是否本地存储可否为BE和CN。我们先来介绍一下FE,它作为sr的执行前端,它有着如下几大职责:

  1. 元数据信息管理与同步:FE负责元数据信息的管理和同步,而元数据设计数据表的名称、字段信息、分区方式和分桶规则等信息,在FE以集群的方式部署的情况下,元数据必须保证强一致性才可避免表结构修改带来的一系列查询和写入的问题
  2. 客户端连接管理
  3. 查询规划:收到用户查询语句后,FE会在针对这句sql从逻辑和物理的角度进行优化,再生成分布式执行计划
  4. 查询调度:基于第三点的查询规划生成的计划,协调各个节点完成任务的查询并归并返回客户端

这里可能说的有点抽象,我们不妨基于一个简单的例子来说明这一点,假设我们现在要执行下面这句sql:

select t1.id,t1.name,t2.email from t1 left join t2 on t.id =t2.id where id <12931 
1

对应的FE会基于元数据信息定位到t1和t2表的元数据信息,在查询规划阶段对该sql进行语法解析再进行执行计划生成,而对应的优化有逻辑层面的优化和物理层面的优化,我们先来说说逻辑层面的优化,为了避免非必要的数据关联,这条sql在逻辑上被优化为先基于id定位t1表的数据,再进行关联也就是我们常说的谓词下推。

有了逻辑优化的基础后,物理层面的优化也就是基于代价模型Cost-Based Optimizer, CBO)获取最有的执行策略,例如当前表量级是多少,是进行全表扫描还是走索引,我们假设当前表上走索引,又因为看到t2表是一张小表,所以在小表广播(小表副本发送到各个BE节点)和大表重分布(关联表hash分布到各个节点执行join)之间选择的小表广播。

有了计划,便可执行查询调度,FE会基于BE的分布情况和当前负载的信息将执行计划拆分为多个分段交由这些BE并行执行,调度时考虑非必要的网络IO,FE会优先将执行计划交给分布在其物理位置上的BE上,同时考虑到可靠性,某个BE查询失败会自动重试或者重新调度到其他节点。

最后BE完成计划的执行之后将结果交给FE进行聚合汇总交给客户端。

sr-3.drawio

有了上述基于FE对于宏观流程的拆解后,我们再来介绍一下BE,BE主要负责sql计划执行和数据存储,通过FE与定义的规则将数据分发到各个BE,BE按照规定格式完成数据导入并生成索引。

上文提到如果数据在HDFS上存储时,采用的则是CN,CN也就是计算节点,只负责计算任务和缓存部分数据以尽可能保证计算任务的高效。

# 存算一体

有了上述几个组件的基本概念之后,我们就可以了解以下sr几种常见的存储架构,先来说说存算一体,在存算一体架构中,BE负责数据存储和计算,因为数据都存储在当前节点下,避免了数据传输和复制的开销,所以可提供极快的查询和分析性能,同时该架构还支持多副本数据存储,在保证高并发的同时还能提供高可靠,适合用追求最佳查询性的场景。

在存算一体的架构中,FE负责元数据管理和执行计划构建,对应BE负责数据存储和查询计算,BE利用本地存储加速查询,并使用多副本机制确保数据的高可用:

sr-4.drawio

# 存算分离

存算分离是另外一种托管云的方案,即数据都存储在HDFS上,利用HDFS实现较低成本发挥高可靠和可拓展的优势,CN以计算节点的身份仅仅负责执行计算任务,并将请求提交到远端存储系统,因为数据不存储在cn节点上所以执行时存在一定的时延,为保证存储性能,cn设置了一定的缓存,在缓冲命中率较高的情况下,cn可以保证查询效率,一旦遇到各种非热点查询的情况,这种架构在性能表现就逊色于前者:

sr-5.drawio

# 更多关于StarRocks

# CBO优化器

当涉及多表关联查询时,例如雪花模型的关联查询,执行引擎会基于成本分析选择合适的执行计划,这就是典型的np-hard问题即分析时会根据表的量级出现n!的连接顺序,考虑到这一点sr的优化器则是Cascades Like即级联友好,它通过规则驱动(即上述的逻辑与优化)配合代价模型以及memo存储等价计划避免重复计算等方式对此问题进行的优化。

除了上述的优化,CBO优化器还增加了如下细节:

  1. 公共表达式复用:sr针对已执行过的查询会将其缓存避免重复计算,例如当我们执行select (a+b) /c, (a+b) +d from tb优化器就会提取公共表达式a+b并将查询结果缓存,避免多次的重复运算。
  2. Lateral Join:即查询时可直接基于左边的结果右边右边查询语句的条件完成关联查询返回,例如执行 SELECT * FROM tbl1, LATERAL (SELECT * FROM tbl2 WHERE tbl2.id = tbl1.id) Lateral Join就会将tbl1的每一个数据查处然后作为右侧tbl2的关联条件进行查询,关联数据和左表数据合并返回

sr-6.drawio

  1. 低基数字典压缩:针对一些区分度不是很明显的字段列,例如性别等字段,sr会将其进行压缩存储为整数字典以节省内存占用空间同时保证检索效率:

sr-7.drawio

  1. Join Reorder:根据关联过滤性决定逻辑执行计划,例如a join b join c,如果b join c可以过滤更多的数据,那么优化器就会优先执行后一段计划,基于查询结果执行再关联a表。
  2. 分布式执行策略:这也就是上文所说的根据数据的分布选择小表广播还是大表重分布。

基于上述的各种优化手段,sr已经可以完整的支持TPC-DS 99条SQL

# 实时更新列

sr自持秒级的导入延迟,提供准实时的服务能力,同时sr的存储引擎在数据导入是能够保证一次导入的ACID,即每次导入要么都成功要么都失败,同时在查询上sr也是支持Snapshot Isolation即快照格式,这也就意味着sr针对当前事物读取结果期间,无论其他事物如何修改,都不会影响当前事物的视图。

这听起来可能和mysql的可重复度即rr隔离级别很类似,只不过sr说只能解决已有数据快照的幻读,但对于新增数据的幻读却无能为力,因为sr并没有像mysql那样查询时会带上间隙锁。

sr-8.drawio

# 智能物化视图

sr视图是跟随着原始数据表一并更新,只要原始数据发生变更,对应的物化视图也会随之更新,不需要额外的运维操作,同时sr在进行查询规划时也会优化器一旦发现某张物化视图可加速查询,则会将查询改写转交到该视图下查询提升查询速度。

# 小结

本文基于理论向的角度介绍了sr的基本概念和常见架构和内置的一些优化理念,希望对你有帮助。

我是 SharkChili,Java 开发者,Java Guide开源项目维护者。欢迎关注我的公众号:写代码的SharkChili,也欢迎您了解我的开源项目 mini-redis:https://github.com/shark-ctrl/mini-redis。

为方便与读者交流,现已创建读者群。关注上方公众号获取我的联系方式,添加时备注加群即可加入。

# 参考

StarRocks官方文档:< https://docs.starrocks.io/zh/docs/introduction/what_is_starrocks/>

编辑 (opens new window)
上次更新: 2026/03/26, 01:05:31
深度探索:Spring借助Easy - Es开启ElasticSearch操作实战篇章

← 深度探索:Spring借助Easy - Es开启ElasticSearch操作实战篇章

最近更新
01
基于EasyExcel实现高效导出
03-25
02
从开源框架中学习那些实用的位运算技巧
03-25
03
浅谈分布式架构设计思想和常见优化手段
03-25
更多文章>
Theme by Vdoing | Copyright © 2025-2026 Evan Xu | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×
×