Doris 入门

该文章已生成可运行项目,

1. 数据表设计

数据模型:
  1. duplicate key 明细表
  2. uniq key主键表 (1.2以后写时合并)
  3. aggregate key 预聚合表 (count(*)会很慢)
数据划分 (在 key 列上指定):
  1. 手动分区:
    • range 分区:

      1. fixed range: 自己写出分区字段的划分值, 左闭右开.
        PARTITION BY RANGE(`date`)
        (
            PARTITION `p201701` VALUES [("2017-01-01"),  ("2017-02-01")),
            PARTITION `p201702` VALUES [("2017-02-01"), ("2017-03-01")),
            PARTITION `p201703` VALUES [("2017-03-01"), ("2017-04-01"))
        )
        
      2. less then: 制定每个分区的上界, 下届由上个分区的上界给出
        PARTITION BY RANGE(`date`)
        (
            PARTITION `p201701` VALUES LESS THAN ("2017-02-01"),
            PARTITION `p201702` VALUES LESS THAN ("2017-03-01"),
            PARTITION `p201703` VALUES LESS THAN ("2017-04-01"),
            PARTITION `p2018` VALUES [("2018-01-01"), ("2019-01-01")),
            PARTITION `other` VALUES LESS THAN (MAXVALUE)
        )
        
      3. batch range: 指定 from , to , interval
        PARTITION BY RANGE(`date`)
        (
            FROM ("2000-11-14") TO ("2021-11-14") INTERVAL 2 YEAR
        )
        
      4. MULTI RANGE: 以上三种 range 可以再建表时都使用
    • List 分区
      指定分区的枚举值

      PARTITION BY LIST(city)
      (
          PARTITION `p_cn` VALUES IN ("Beijing", "Shanghai", "Hong Kong"),
          PARTITION `p_usa` VALUES IN ("New York", "San Francisco"),
          PARTITION `p_jp` VALUES IN ("Tokyo")
      )
      
  2. 动态分区
    不会在导入数据时创建分区, 动态分区只是会按照设定的规则,滚动添加、删除分区,从而实现对表分区的生命周期管理(TTL),减少数据存储压力。
  3. 自动分区
    按照插入的数据自动分区
    UNIQUE KEY(`TRADE_DATE`, `TRADE_ID`)     -- 指定 key
    AUTO PARTITION BY RANGE (date_trunc(`TRADE_DATE`, 'year'))   -- 自动分区生成的方法
    
  4. 分区内再分桶
    • hash 分桶
      DISTRIBUTED BY HASH(region) BUCKETS 8
      
    • random 分桶
      只使用与不在此列上进行过滤等操作, 单单分散数据的需求
      DISTRIBUTED BY RANDOM BUCKETS 8
      
    • 什么样的列适合做分桶键?
      高基数 (唯一值较多) …
表索引
  • 点查索引
    查询 where =where in, 直接返回可能满足 where 条件行的文件块
    1. 前缀索引
      • 在表的 key 键上(查看数据模型)自动创建的, 因此一张表只有一个前缀索引
      • doris 在 key 列上自动排序, 没隔 1024 行加一个索引. 因此, 可以在等值查询时直接拿取对应取值范围内的数据文件
    2. 倒排索引
      • 如果一个列设置为倒排索引, 会把此列的不同离散值 : 对应的行号集合 作为映射关系存起来
  • 跳数索引
    查询 where =where in, 过滤掉肯定不存在满足查询行的数据文件
    1. ZoneMap 索引
      维护数据文件的统计信息: 该列的最大值, 最小值 , null 值
    2. bloomfilter 索引
      bloomfilter 中不存在的肯定不在对应的数据文件中
        PROPERTIES (
           "bloom_filter_columns" = "column_name1,column_name2"
        );
    
    1. Ngram - bloomfilter 索引
      适合对文本字段进行 like 查询. 先分词再在分词上做 bloomfilter
  • 索引配置银弹
    1. 最频繁使用的过滤条件指定为 Key 自动建前缀索引,因为它的过滤效果最好,但是一个表只能有一个前缀索引,因此要用在最频繁的过滤条件上
    2. 对非 Key 字段如有过滤加速需求,首选建倒排索引,因为它的适用面广,可以多条件组合,次选下面两种索引:
      1. 有字符串 LIKE 匹配需求,再加一个 NGram BloomFilter 索引
      2. 对索引存储空间很敏感,将倒排索引换成 BloomFilter 索引
    3. 如果性能不及预期,通过 QueryProfile 分析索引过滤掉的数据量和消耗的时间,具体参考各个索引的详细文档
最佳实践
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值