**1\. 查詢sql編寫規范**
(1)當多表聯查時,查詢的數據僅從其中一張表出時,可考慮使用IN操作而不是JOIN。
(2)多表查詢性能較差,多表Join時要滿足小表在右的原則,右表關聯時被加載到內存中與左表進行比較,ClickHouse中無論是Left Join 、Right Join還是Inner Join永遠都是拿著右表中的每一條記錄到左表中查找該記錄是否存在,所以右表必須是小表。
(3)將一些需要關聯分析的業務創建成字典表進行join操作,前提是字典表不宜太大,因為字典表會常駐內存。
(4)禁?業務select \*?,列存數據,每減少一個字段會減少大量的數據掃描,提升查詢效率。
(5)建議使用 limit 限制返回數據條數使用limit返回指定的結果集數量,不會進行向下掃描,大大提升了查詢效率。
(6)查詢時如果可以建議帶上分區鍵查詢,可以有效減少數據掃描量,提升查詢效率。
(7)CK的稀疏索引使得點查詢(即kv類型的查詢)性能不佳,千萬不要把它簡單當做關系型數據庫進行查詢。
(8)使用Global優化分布式子查詢,避免出現查詢指數級放大。
(9)使用 uniqCombined 替代 distinctuniqCombined 對去重進行了優化,通過近似去重提升十倍查詢性能。
(10)盡量不去使用字符串類型,時間類型最終會轉換成數值類型進行處理,數值類型在執行效率和存儲上遠好過字符串。
(11)ClickHouse的分布式表性能性價比不如物理表高,建表分區字段值不宜過多,防止數據導入過程磁盤可能會被打滿。
(12)不要在唯一列或大基數列上進行分組或去重操作,基數太大會消耗過多的io和內存。
(13)CPU一般在50%左右會出現查詢波動,達到70%會出現大范圍的查詢超時,CPU是最關鍵的指標,要非常關注。
**2. 數據寫入注意事項**
(1)不適合高并發寫入,最好還是從異步化隊列寫入,batch insert 5w-10w 起步,盡量不要執行單條或插入操作,會產生大量小分區文件,給后臺merge任務帶來巨大壓力。
(2)幾乎完全不支持update/delete,也不支持事務。
(3)建議表要指定分區鍵,尤其是數據量大的表,插入/查詢/合并都是以分區為單位,合理的分區可以提升整體性能。
(4)分區不建議太多,如果分區太多,會因需要打開的文件描述符過多導致查詢效率不佳。
(5)數據在寫入ClickHouse前預先的對數據進行分組,避免一次插入的數據屬于多個分區。
(6)注意MerTree 主鍵允許存在重復數據(ReplacingMergeTree可以在分區內去重)。
**3. 建表規范**
(1)本地表命名格式:{tab\_name}\_local,分布式表命名格式:{tab\_name}\_shard 。
(2)物化視圖命名規范:{tabl\_name\_xxx}\_mv 。
(3)盡量不要使用Nullable類型,該類型對性能有一定影響,且不能包含在索引中。
(4)合理設置分區,所有本地表使用order by關鍵字指定分區字段,建議采用日期作為一級分區。默認 order by 字段作為主鍵。
(5)如果表中不是必須保留全量歷史數據,建議指定TTL,可以免去手動過期歷史數據的麻煩。
(6)所有復制引擎表建表指定 use\_minimalistic\_part\_header\_in\_zookeeper=1。
?本地ReplicatedMergeTree表建表模板如下所示:
~~~sql
CREATE TABLE IF NOT EXISTS ads. ads_af_city_complaint_1d _local ON cluster ycdata_3shards_3replicas
(`id` UInt64 COMMENT '序號',
`order_id` UInt64 COMMENT '訂單號',
`gross_weight` UInt64 COMMENT '權重',
`create_time` Date COMMENT '創建時間',
`event` String COMMENT '事件')
ENGINE = ReplicatedMergeTree('/clickhouse/table/{shared}/ads_af_city_complaint_1d _local', '{replica}')
PARTITION BY create_time
ORDER BY id
TTL create_time + toIntervalDay(90)
SETTINGS index_granularity = 8192, use_minimalistic_part_header_in_zookeeper = 1;
~~~
**解釋:**
* TTL 定義了數據保留策略為90天。
* {shared},{replica}無需替換為一個具體值。
* ycdata\_3shards\_3replicas為clickhouse是集群名稱。
- 導讀
- 概述
- 第一章 安裝部署
- 1.1. docker安裝clickhouse
- 第二章 使用實踐與規范
- 2.1. ClickHouse應用場景
- 2.2. 表引擎選擇
- 2.2.1. MergeTree表引擎
- 2.2.2. ReplicatedMergeTree表引擎
- 2.2.3. ReplacingMergeTree表引擎
- 2.2.4. SummingMergeTree表引擎
- 2.2.5. Aggregatingmergetree表引擎
- 2.3. 開發規范
- 2.4. 集群架構
- 2.4.1. 常用架構
- 2.4.2. zookeeper的關鍵作用
- 2.4.3. chproxy
- 2.5. 客戶端工具選擇
- 2.6. 可用性說明
- 2.7. 集群配置參數調優
- 第三章 數據類型&語法以及常用函數
- 3.1. 基礎數據類型
- 3.2. SQL函數
- 3.3. DDL與DML基本語法
- 3.4. UPDATE 和 DELETE操作
- 3.4.1. 數據UPDATE和DELETE操作示例
- 3.4.2. 數據的實時更新操作(Real-time UPDATE)
- 第四章 clickhouse實戰篇
- 4.1. JDBC操作clickhouse
- 4.2. clickhouse集成mybatis