ClickHouse 建表create table時primary by與order by

參考文章:https://cloud.tencent.com/developer/article/1604965

 

 

一、

ORDER BY 決定了每個分區中數據的排序規則;

PRIMARY KEY 決定了一級索引(primary.idx);

ORDER BY 可以指代PRIMARY KEY, 通常只用聲明ORDER BY 即可。

 

MergeTree的主鍵(PRIMARY KEY)只是用來生成一級索引(primary.idx)的,並沒有唯一性約束這樣的語義。

 

ReplacingMergeTree通過ORDER BY,表示判斷唯一約束的條件。當分區合併之時,根據ORDER BY排序後,相鄰重複的數據會被排除。

 

由此,可以得出幾點結論:

第一,使用ORDER BY作爲特殊判斷標識,而不是PRIMARY KEY。關於這一點網上有一些誤傳,但是如果理解了ORDER BYPRIMARY KEY的作用,以及合併邏輯之後,都能夠推理出應該是由ORDER BY決定。

ORDER BY的作用, 負責分區內數據排序;

PRIMARY KEY的作用, 負責一級索引生成;

Merge的邏輯, 分區內數據排序後,找到相鄰的數據,做特殊處理。

第二,只有在觸發合併之後,才能觸發特殊邏輯。以去重爲例,在沒有合併的時候,還是會出現重複數據。

第三,只對同一分區內的數據有效。以去重爲例,只有屬於相同分區的數據才能去重,跨越不同分區的重複數據不能去重。

 

 

二、

值得一提的是,通常只有在使用SummingMergeTree或AggregatingMergeTree的時候,才需要同時設置ORDER BYPRIMARY KEY。

顯式的設置PRIMARY KEY,是爲了將主鍵和排序鍵設置成不同的值,是進一步優化的體現。

例如某個場景的查詢需求如下:

聚合條件,GROUP BY A,B,C

過濾條件,WHERE A

此時,如下設置將會是一種較優的選擇:

GROUP BY A,B,C

PRIMARY KEY A

BTW,如果ORDER BYPRIMARY KEY不同,PRIMARY KEY必須是ORDER BY的前綴(爲了保證分區內數據和主鍵的有序性)。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章