jeremygo

jeremygo

我是把下一颗珍珠串在绳子上的人

Druid 查询最佳实践

前言#

Druid 是一个分布式的、支持实时多维分析的数据处理系统,既支持高速的数据实时摄入处理,也支持实时且灵活的多维数据分析查询,同时支持根据时间戳对数据进行预聚合摄入和聚合分析。

名词含义
时间戳列数据的时间戳列,所有的查询都是以时间为中心
维度列数据的维度列,用于过滤数据
指标列数据的聚合列,支持包括 sum、count、mix 和 max 等计算
聚合数据按照时间戳列、维度列、聚合列和聚合粒度进行归并的过程
聚合粒度接收到多长时间的数据归并为一条

image

最佳实践#

贴合 Druid 的特点避免进行效率比较差的操作导致查询缓慢甚至超时积压等情况:

  • 提升预聚合比例
    • 聚合粒度设置为分钟
    • 删掉不需要的字段,同时尽量不要包含明细字段
    • 在上一条的基础上如果一个数据源无法满足所有查询可以拆分成多个数据源,对应使用不同的维度列
    • 需要 count distinct 的字段设置成 hyperUnique 指标
  • 不要在 SQL 中做行级别的复杂运算,尽可能利用预先计算好的字段
  • 不要在 group by 高基数字段的同时 count distinct
    • 首先避免 group by 高基数字段(超过几万个值的字段)
    • group bycount distinct 都会使用 heap 存储中间结构,叠加容易造成查询超时或资源超过限制,更严重会导致 Druid 发生完全的垃圾回收操作影响整个集群
    • Druid 也会将成功的查询生成中间缓存,后续类似的 SQL(时间范围略有不同,其余查询条件完全相同)可以命中中间缓存
  • where 过滤条件放越外层越好
  • 使用正确的类型进行查询,推荐使用 =in 把范围过滤转为等值过滤
  • 尽量避免使用 like 或正则匹配提取大文本,推荐上游产出数据时就提取到独立字段中,减少存储和查询成本
  • 使用 group by Floor(__time to DAY) 替换 group by __time,即指定具体的时间粒度,两者效率差别很大
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。