首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Doris 数据模型:克服三大神器的选择困难症

Doris 数据模型:克服三大神器的选择困难症

作者头像
苏奕嘉
发布2025-07-14 18:34:09
发布2025-07-14 18:34:09
880
举报

当程序员小张第108次为慢查询抓狂,当DBA老王看着分桶配置陷入沉思,当架构师Lisa面对数据倾斜欲哭无泪——有没有一种可能,让数据库既快又稳还能保住程序员的发际线? Apache Doris拍了拍胸脯:"这事儿,得加钱?不,得加我!"

三大数据模型神器

1. Duplicate Key:日志界的收纳大师

图片
图片

适用场景

  • • 原始数据就像女朋友的购物车——只增不减
  • • 需要随时旧账的日志分析
代码语言:javascript
复制
CREATE TABLE 程序员摸鱼日志 (
   工位号 SMALLINT COMMENT '摸鱼重灾区',
   摸鱼时间 DATETIME COMMENT '作案时间',
   手机型号 VARCHAR() COMMENT '作案工具',
   APP名称 VARCHAR() COMMENT '王者荣耀/小红书...'
)
DUPLICATE KEY(工位号, 摸鱼时间) -- 排列组合随心查
DISTRIBUTED BY HASH(工位号) BUCKETS ;
-- 注释:此表可能引发人事部关注,慎用!

2. Aggregate Key:报表界的数学课代表

图片
图片

灵魂功能

  • • SUM:像会计一样精打细算
  • • REPLACE:新数据来了旧的就狗带
  • • BITMAP_UNION:精准统计摸鱼人次
代码语言:javascript
复制
CREATE TABLE 摸鱼统计报表 (
   工位号 INT,
   摸鱼类型 VARCHAR(),
   摸鱼时长 BIGINT SUM DEFAULT '0' COMMENT '累计摸鱼时间',
   被抓次数 BIGINT REPLACE DEFAULT '0' COMMENT '最新记录'
)
AGGREGATE KEY(工位号, 摸鱼类型) 
DISTRIBUTED BY HASH(工位号) BUCKETS ;
-- 警告:此表可能导致程序员集体抗议

3. Unique Key:数据界的洁癖患者

图片
图片

必杀技

  • • Merge-on-Write:像霸道总裁一样覆盖旧数据
  • • 主键唯一性:防重复比防脱发还严格
代码语言:javascript
复制
CREATE TABLE 程序员信息表 (
   员工ID BIGINT COMMENT '防伪标识',
   发量 TINYINT COMMENT '重要指标',
   最后摸鱼时间 DATETIME COMMENT '高危字段'
)
UNIQUE KEY(员工ID) -- 主键防重就像防秃
DISTRIBUTED BY HASH(员工ID) BUCKETS  
PROPERTIES("enable_unique_key_merge_on_write" = "true");
-- 注意:发量字段建议设置自动递减触发器

索引武器库:DBA的防身利器

1. 前缀索引:查询界的闪电侠

使用口诀

  • • 最常查的字段放前面,就像把女朋友照片放手机桌面
  • • 高基数列打头阵,VARCHAR别超过20字符
代码语言:javascript
复制
-- 错误示范:把发量这种低基数列放前面
CREATE TABLE 秃头表 (
   发量 TINYINT,  -- 查询时慢到怀疑人生
   员工ID BIGINT
) 
DUPLICATE KEY(发量);

2. 倒排索引:文本界的福尔摩斯

黑科技配置

代码语言:javascript
复制
CREATE TABLE 程序员吐槽日志 (
   内容 TEXT COMMENT '含大量"秃头""996"等关键词',
   INDEX 吐槽索引(内容) USING INVERTED PROPERTIES("parser"="chinese")
)
-- 使用:快速定位吐槽最狠的程序员
SELECT * WHERE 内容 MATCH_ANY '加班 脱发';

3. BloomFilter:海量数据里的金属探测器

适用场景

  • • 身份证号查询:一亿数据中找特定ID只要0.1秒
  • • 千万别用在性别字段:就像用金属探测器找空气
代码语言:javascript
复制
CREATE TABLE 防沉迷系统 (
   用户ID BIGINT COMMENT '高基数字段',
   游戏时长 INT
) PROPERTIES (
   "bloom_filter_columns"="用户ID"  -- 查人快准狠
);

分区分桶:程序员的头发守恒定律

分桶秘籍

代码语言:javascript
复制
DISTRIBUTED BY HASH(用户ID) BUCKETS  
-- 分桶就像分蛋糕,要均匀才不会打架
-- 每个桶1-10G最佳,太小容易头秃,太大容易头冷

动态分区黑魔法

代码语言:javascript
复制
PARTITION BY RANGE(摸鱼时间) (
    FROM ("2023-01-01") TO ("2024-01-01") INTERVAL  MONTH
)
PROPERTIES (
   "dynamic_partition.enable" = "true",  -- 自动管理分区
   "dynamic_partition.time_unit" = "MONTH"  -- 按月自动分
);
-- 从此告别手动建分区的加班生活

血泪教训:小文件末日

代码语言:javascript
复制
**症状**:集群突然卡成PPT  
**尸检报告**:忘记设置`load_to_single_tablet=true`  
**抢救步骤**:
1. 停止所有写入(像暂停心跳一样重要)
2. 执行`ADMIN COMPACT TABLE;`(给数据做心脏复苏)

字段类型:程序员的类型安全防护器

1. VARCHAR vs STRING

代码语言:javascript
复制
地址 VARCHAR()  -- 适合普通地址
犯罪现场描述 STRING   -- 适合写小说级的事故报告

2. JSON类型:摆脱字符串地狱

代码语言:javascript
复制
CREATE TABLE 程序员属性 (
   员工ID BIGINT,
   技能树 JSON COMMENT '{"语言":["Java","SQL"],"发量":0}'
)
-- 查询技能:SELECT 技能树->'$.语言[0]' 

3. 时间类型:精确到毫秒的摸鱼记录

代码语言:javascript
复制
摸鱼时间 DATETIME()  -- 精确到毫秒
-- 用于证明"我就刷了1秒朋友圈"

防秃小贴士

  • • 合理使用物化视图,查询速度提升50%,发量多保留30%
  • • 定期检查分区分桶,避免小文件问题导致的突发性脱发
  • • 遇到性能问题先看执行计划和Profile,比求神拜佛管用

尾声

补习班将在后续推出新系列:《大话 Doris》,将以诙谐幽默的语言来帮大家更好的理解 Doris 的各种能力~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Apache Doris 补习班 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 三大数据模型神器
    • 1. Duplicate Key:日志界的收纳大师
    • 2. Aggregate Key:报表界的数学课代表
    • 3. Unique Key:数据界的洁癖患者
  • 索引武器库:DBA的防身利器
    • 1. 前缀索引:查询界的闪电侠
    • 2. 倒排索引:文本界的福尔摩斯
    • 3. BloomFilter:海量数据里的金属探测器
  • 分区分桶:程序员的头发守恒定律
    • 分桶秘籍
    • 动态分区黑魔法
    • 血泪教训:小文件末日
  • 字段类型:程序员的类型安全防护器
    • 1. VARCHAR vs STRING
    • 2. JSON类型:摆脱字符串地狱
    • 3. 时间类型:精确到毫秒的摸鱼记录
  • 尾声
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档