暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

65

 

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


三大数据模型神器

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

适用场景

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

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

灵魂功能

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

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

必杀技

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


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

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

使用口诀

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

DUPLICATE KEY(发量);

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

黑科技配置

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

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

适用场景

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


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

分桶秘籍

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

动态分区黑魔法

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

血泪教训:小文件末日

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


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

1. VARCHAR vs STRING

地址 VARCHAR(65533)  -- 适合普通地址
犯罪现场描述 STRING   -- 适合写小说级的事故报告

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

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

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

摸鱼时间 DATETIME(6)  -- 精确到毫秒
-- 用于证明"我就刷了1秒朋友圈"


防秃小贴士

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

尾声

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

看到这里了,不得来个点赞在看呀!这是最大的更新动力!也欢迎各位火爆转发

如果你有加 Apache Doris 官方社区、PowerData 官方社区、Doris 补习班社区、Dinky 官方社区的诉求,可加我微信即刻拉你~

公众号:Apache Doris 补习班

B站号:ApacheDoris补习班

个人微信:fl_manyi

初五喜迎财神,祝大家新年发大财~

 


文章转载自Apache Doris 补习班,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论