ClickHouse简介
ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。
• 列式存储。
• 向量化计算引擎。
• 数据压缩。
• 多核并行处理。
• 分布式执行。
• 稀疏索引。
受益于上述特性,常规的业务查询均在亚秒内返回。
适用场景
适用于交互式场景分析,为用户提供极速分析体验,能够支撑实时数据分析
和海量数据离线分析。
业务场景
• 用户行为分析,计算PV,UV,点击率等。
• 标签服务,人群预估, 人群圈选。
• 日志分析,全文检索。
• 电商交易分析。
• OGV内容分析。
共同特性
海量数据,大宽表,点查,聚合,交互式分析。
不太适合
• 高并发,高频次。
• JOIN(关联查询)。
• ETL Job。
建表
在查询过程使用分区键,索引,prewhere可
以有效地过滤掉不需要的数据,提升查询性
能。
• 分区键:筛选出需要读取的data part。
• 索引:筛选出需要读取的mrk(granualrity)。
• prewhere:筛选出需要读取的实际行数。
分区键怎么填写?
一般设置为天级别分区。
如果单日百万级数据量,可以设置为月份区,如果单日数十亿级数据量,可以设置为小时分区,具体需根据数据量,查询情况和数据导入来决定,常规业务设置为天级分区即可。
举例:假设时间戳字段为log_date,注意该字段必须存在column里面。
• 如果数据类型为Date,则分区键可以直接设置为log_date,或toYYYYMMDD(log_date)
• 如果数据类型为DateTime, 则分区键可以直接设置为toDate(log_date), 或toYYYYMMDD(log_date)
• 如果数据类型为String,如果是天级别,可以直接设置为log_date,如果非天级别,可以使用
substring()进行截取,比如log_date=2023-05-12 10:00:00, substring(log_date, 1, 10)=2023-05-12。
Rider离线导入overwrite模式依赖于分区键,如果想使用overwrite模式,必须设置分区键。
一级索引怎么填写?
一级索引为线性索引,建议设置为最常用的过滤条件,数量最好不超过3个,按照基数由小到大排序。
举例:
点查场景:查询最近几天某个mid的详细信息。
一级索引设置为:mid
聚合场景: 查询最近几天某个事件下某个品牌的聚合信息。
一级索引设置为:event_id,brand
聚合场景:查询最近几分钟或几个小时的聚合信息。
一级索引设置为:time
注意:查询需添加分区键过滤,上述的最近几天由分区键进行过滤。
生命周期怎么填写?
假设时间戳字段为log_date,注意该字段必须存在column里面。
如果log_date是时间数据类型,则可以直接作为TTL表达式。
比如:log_date数据类型为Date, DateTime
如果log_date是非时间数据类型,比如是String类型。
1.如果值为:yyyy-MM-dd or yyyy-MM-dd HH:mm:ss
使用自定义表达式:toDate(log_date)
2.如果值为:yyyyMMdd or yyyyMMddHHmmss
使用自定义表达式:toDate(parseDateTimeBestEffort(log_date))
3.如果值为:unix_time(秒,长度为10位,例如1627802598)
使用自定义表达式:toDate(fromUnixTimestamp(CAST(log_date, 'Int32')))
4.如果值为:unix_time(毫秒,长度为13位,例如1627802598285)
使用自定义表达式:toDate(fromUnixTimestamp64Milli(CAST(log_date, 'Int64')))