前言#
Druid 是一个分布式的、支持实时多维分析的数据处理系统,既支持高速的数据实时摄入处理,也支持实时且灵活的多维数据分析查询,同时支持根据时间戳对数据进行预聚合摄入和聚合分析。
| 名词 | 含义 |
|---|---|
| 时间戳列 | 数据的时间戳列,所有的查询都是以时间为中心 |
| 维度列 | 数据的维度列,用于过滤数据 |
| 指标列 | 数据的聚合列,支持包括 sum、count、mix 和 max 等计算 |
| 聚合 | 数据按照时间戳列、维度列、聚合列和聚合粒度进行归并的过程 |
| 聚合粒度 | 接收到多长时间的数据归并为一条 |
最佳实践#
贴合 Druid 的特点避免进行效率比较差的操作导致查询缓慢甚至超时积压等情况:
- 提升预聚合比例
- 聚合粒度设置为分钟
- 删掉不需要的字段,同时尽量不要包含明细字段
- 在上一条的基础上如果一个数据源无法满足所有查询可以拆分成多个数据源,对应使用不同的维度列
- 需要
count distinct的字段设置成hyperUnique指标
- 不要在
SQL中做行级别的复杂运算,尽可能利用预先计算好的字段 - 不要在
group by高基数字段的同时count distinct- 首先避免
group by高基数字段(超过几万个值的字段) group by与count distinct都会使用heap存储中间结构,叠加容易造成查询超时或资源超过限制,更严重会导致Druid发生完全的垃圾回收操作影响整个集群Druid也会将成功的查询生成中间缓存,后续类似的SQL(时间范围略有不同,其余查询条件完全相同)可以命中中间缓存
- 首先避免
where过滤条件放越外层越好- 使用正确的类型进行查询,推荐使用
=或in把范围过滤转为等值过滤 - 尽量避免使用
like或正则匹配提取大文本,推荐上游产出数据时就提取到独立字段中,减少存储和查询成本 - 使用
group by Floor(__time to DAY)替换group by __time,即指定具体的时间粒度,两者效率差别很大