參考文章: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 BY與PRIMARY KEY的作用,以及合併邏輯之後,都能夠推理出應該是由ORDER BY決定。
ORDER BY的作用, 負責分區內數據排序;
PRIMARY KEY的作用, 負責一級索引生成;
Merge的邏輯, 分區內數據排序後,找到相鄰的數據,做特殊處理。
第二,只有在觸發合併之後,才能觸發特殊邏輯。以去重爲例,在沒有合併的時候,還是會出現重複數據。
第三,只對同一分區內的數據有效。以去重爲例,只有屬於相同分區的數據才能去重,跨越不同分區的重複數據不能去重。
二、
值得一提的是,通常只有在使用SummingMergeTree或AggregatingMergeTree的時候,才需要同時設置ORDER BY與PRIMARY KEY。
顯式的設置PRIMARY KEY,是爲了將主鍵和排序鍵設置成不同的值,是進一步優化的體現。
例如某個場景的查詢需求如下:
聚合條件,GROUP BY A,B,C
過濾條件,WHERE A
此時,如下設置將會是一種較優的選擇:
GROUP BY A,B,C
PRIMARY KEY A
BTW,如果ORDER BY與PRIMARY KEY不同,PRIMARY KEY必須是ORDER BY的前綴(爲了保證分區內數據和主鍵的有序性)。