ClickHouse簡介
ClickHouse是一個(gè)用于聯(lián)機(jī)分析(OLAP)的列式數(shù)據(jù)庫管理系統(tǒng)(DBMS)。
? 列式存儲(chǔ)。
? 向量化計(jì)算引擎。
? 數(shù)據(jù)壓縮。
? 多核并行處理。
? 分布式執(zhí)行。
? 稀疏索引。
受益于上述特性,常規(guī)的業(yè)務(wù)查詢均在亞秒內(nèi)返回。
適用場景
適用于交互式場景分析,為用戶提供極速分析體驗(yàn),能夠支撐實(shí)時(shí)數(shù)據(jù)分析
和海量數(shù)據(jù)離線分析。
業(yè)務(wù)場景
? 用戶行為分析,計(jì)算PV,UV,點(diǎn)擊率等。
? 標(biāo)簽服務(wù),人群預(yù)估, 人群圈選。
? 日志分析,全文檢索。
? 電商交易分析。
? OGV內(nèi)容分析。
共同特性
海量數(shù)據(jù),大寬表,點(diǎn)查,聚合,交互式分析。
不太適合
? 高并發(fā),高頻次。
? JOIN(關(guān)聯(lián)查詢)。
? ETL Job。
建表
在查詢過程使用分區(qū)鍵,索引,prewhere可
以有效地過濾掉不需要的數(shù)據(jù),提升查詢性
能。
? 分區(qū)鍵:篩選出需要讀取的data part。
? 索引:篩選出需要讀取的mrk(granualrity)。
? prewhere:篩選出需要讀取的實(shí)際行數(shù)。
分區(qū)鍵怎么填寫?
一般設(shè)置為天級(jí)別分區(qū)。
如果單日百萬級(jí)數(shù)據(jù)量,可以設(shè)置為月份區(qū),如果單日數(shù)十億級(jí)數(shù)據(jù)量,可以設(shè)置為小時(shí)分區(qū),具體需根據(jù)數(shù)據(jù)量,查詢情況和數(shù)據(jù)導(dǎo)入來決定,常規(guī)業(yè)務(wù)設(shè)置為天級(jí)分區(qū)即可。
舉例:假設(shè)時(shí)間戳字段為log_date,注意該字段必須存在column里面。
? 如果數(shù)據(jù)類型為Date,則分區(qū)鍵可以直接設(shè)置為log_date,或toYYYYMMDD(log_date)
? 如果數(shù)據(jù)類型為DateTime, 則分區(qū)鍵可以直接設(shè)置為toDate(log_date), 或toYYYYMMDD(log_date)
? 如果數(shù)據(jù)類型為String,如果是天級(jí)別,可以直接設(shè)置為log_date,如果非天級(jí)別,可以使用
substring()進(jìn)行截取,比如log_date=2023-05-12 10:00:00, substring(log_date, 1, 10)=2023-05-12。
Rider離線導(dǎo)入overwrite模式依賴于分區(qū)鍵,如果想使用overwrite模式,必須設(shè)置分區(qū)鍵。
一級(jí)索引怎么填寫?
一級(jí)索引為線性索引,建議設(shè)置為最常用的過濾條件,數(shù)量最好不超過3個(gè),按照基數(shù)由小到大排序。
舉例:
點(diǎn)查場景:查詢最近幾天某個(gè)mid的詳細(xì)信息。
一級(jí)索引設(shè)置為:mid
聚合場景: 查詢最近幾天某個(gè)事件下某個(gè)品牌的聚合信息。
一級(jí)索引設(shè)置為:event_id,brand
聚合場景:查詢最近幾分鐘或幾個(gè)小時(shí)的聚合信息。
一級(jí)索引設(shè)置為:time
注意:查詢需添加分區(qū)鍵過濾,上述的最近幾天由分區(qū)鍵進(jìn)行過濾。
生命周期怎么填寫?
假設(shè)時(shí)間戳字段為log_date,注意該字段必須存在column里面。
如果log_date是時(shí)間數(shù)據(jù)類型,則可以直接作為TTL表達(dá)式。
比如:log_date數(shù)據(jù)類型為Date, DateTime
如果log_date是非時(shí)間數(shù)據(jù)類型,比如是String類型。
1.如果值為:yyyy-MM-dd or yyyy-MM-dd HH:mm:ss
使用自定義表達(dá)式:toDate(log_date)
2.如果值為:yyyyMMdd or yyyyMMddHHmmss
使用自定義表達(dá)式:toDate(parseDateTimeBestEffort(log_date))
3.如果值為:unix_time(秒,長度為10位,例如1627802598)
使用自定義表達(dá)式:toDate(fromUnixTimestamp(CAST(log_date, 'Int32')))
4.如果值為:unix_time(毫秒,長度為13位,例如1627802598285)
使用自定義表達(dá)式:toDate(fromUnixTimestamp64Milli(CAST(log_date, 'Int64')))