
一 背景
1 PolarDB

2 挑戰
3 方案

二 並行查詢介紹
1 特性
-
完全基於MySQL codebase,原生的MySQL 100%相容,這裡包括
-
語法相容 -
型別相容 -
行為相容 -
0 附加成本,隨產品釋出就攜帶的功能
-
無需額外儲存資源 -
無需額外計算節點 -
0 維護成本,使用和普通查詢沒有任何差別,只是響應變快了
-
隨叢集部署,開箱即用 -
對業務無侵入 -
單一配置引數(並行度) -
即時性分析,PolarDB原生的一部分,受惠於REDO物理複製的低延遲
-
統一底層事務型資料 -
提交即可見 -
極致效能,隨著PQ的不斷完善,對於分析型運算元、複雜查詢結構的支援能力不斷提升
-
全運算元並行 -
高效流水線 -
複雜SQL結構支援 -
穩定可靠,作為企業級特性,這個毋庸置疑
-
擴充套件MySQL測試體系 -
線上多年積累 -
完備診斷體系
2 演進
PQ1.0

-
執行模式是簡單的scatter-gather,也就是隻有一個plan slice,多個worker完成相同的功能,彙總到leader
-
儘可能的下推運算元到worker上
-
leader負責完成無法下推的計算
-
計劃形態是單一的,導致運算元的並行方式單一,比如group by + aggregation,只能透過二階段的聚集來完成:worker先做partial aggregation,leader上做final aggregation
-
一旦leader上完成聚集操作,後續如果有distinct / window function / order by等,都只能在leader上完成,形成單點瓶頸
-
如果存在資料傾斜,會使部分worker沒有工作可做,導致並行擴充套件性差
-
此外實現上還有一些待完善的地方,例如少量運算元不支援並行、一些複雜的查詢巢狀結構不支援並行
PQ2.0

-
全新的Cost-based並行最佳化器,基於統計資訊和代價決定最優計劃形態
-
全運算元的並行支援,包括上面提到的複雜的多層巢狀結構,也可以做到完全的並行
-
引入exchange運算元,也就是支援shuffle/broadcast這樣的資料分發操作
-
引入一定自適應能力,即使並行最佳化完成了,也可以根據資源負載情況做動態調整,如回退序列或降低並行度
SELECT t1.a, sum(t2.b)
FROM
t1 JOIN t2 ON t1.a = t2.a
JOIN t3 ON t2.c = t3.c
GROUPBY t1.a
ORDERBY t1.a
LIMIT10;

-
在join的表集合中,尋找一個可以做邏輯分片的表做拆分,如果3個表都不足以拆分足夠多的分片,那就選最多的那個,比如這裡選擇了t2,它可能拆出12個分片,但仍然無法滿足並行度16的要求,導致有4個worker讀不到資料而idle。
-
聚集操作先在worker上做區域性聚集,leader上做彙總聚集,如果各個worker上分組的聚攏不佳,導致leader仍然會收到來自下面的大量分組,leader上就會仍然有很重的聚集計算,leader算的慢了,會來不及收worker資料,從而反壓worker的執行速度,導致查詢整體變慢。


-
雖然仍然只能在t2上做資料分片,但12個worker只需要完成t1 join t2這個操作,在join完成後一般資料量會膨脹,透過Shuffle(Repartition)將更多的中間結果分發到後續的slice中,從而以更高的並行度完成與t3的join -
各worker完成區域性聚集後,如果分組仍很多,可以基於group by key做一次Shuffle來將資料打散到下一層slice,下一組worker會並行完成較重的聚集操作,以及隨後的order by區域性排序,最終leader只需要做一次merge sort的彙總


-
隨著業務增長資料不斷膨脹,透過相應提高並行度來使用匹配的計算資源,來持續得到穩定可預期的查詢效能
-
始終快速的分析時間可以驅動快速的業務決策,使企業在快速變化的市場環境中保持競爭力
3 架構

-
Cost-based Parallel Optimizer,嵌入在MySQL的最佳化器框架中,完成並行最佳化部分
-
Parallel Plan Generator,根據抽象的並行計劃描述,生成可供worker執行的物理執行計劃
-
Parallel Executor,並行執行器元件,包括一些運算元內並行功能和資料分發功能等
4 效能

5 使用方式

三 並行查詢實現
1 並行最佳化器
代價模型的增強
-
統計資訊自動更新 -
序列最佳化流程中做針對並行執行的補強,例如修正table掃描方式等,這也是上面效能資料中Q6/Q12會有超線性加速比的原因 -
全運算元統計資訊推導+代價計算,補充了一系列的cost formula和cardinality estimation推導機制

自適應執行策略

-
序列最佳化與並行最佳化解耦,並行最佳化會重新構建抽象運算元樹,並以此為輸入開始enumeration -
並行最佳化與並行計劃生成解耦,最佳化的結果是計劃子片段的抽象描述,作為輸出進行plan generation
基於代價的窮盡式列舉

2 並行計劃生成

SELECT t1.a, sum(t2.b) sumb
FROM t1 join t2
ON t1.c = t2.c
GROUPBY t1.a
ORDERBY sumb;
-
clone
-
refix
3 並行執行器
parallel scan

-
儘量做細粒度的切分,使分片數 >> worker數,然後worker之間透過round robin的方式去“搶”分片來執行,這樣自然做到了能者多勞,避免由於資料分佈skew導致的負載不均衡問題,這是shared storage系統的一個天然優勢。 -
切分時可以不用dive到葉子節點,也就是以page作為最小分割槽單位,來加速初始分割槽速度。
parallel hash join

-
build階段,多個worker向同一個共享的lock-free hash table中插入資料。 -
probe階段,多個worker並行到hash table做搜尋。
partition hash join

-
build/probe兩側都根據join key做shuffle,將資料分發到目標partition; -
在每個partition內,build側各自構建小hash table; -
在每個partition內,probe側各自查詢對應的hash table;
子查詢並行 – pushdown exec
SELECT c1 FROM t1
WHEREEXISTS (
SELECT c1 FROM t2 WHERE t2.a = t1.a <= EXISTS subquery
)
ORDERBY c1
LIMIT10;

子查詢並行 – pushdown shared
SELECT c1 FROM t1
WHERE t1.c2 IN (
SELECT c2 FROM t2 WHERE t2.c1 < 15 <= IN subquery
)
ORDERBY c1
LIMIT10;


Exchanges

四 未來規劃
-
打通節點間計算資源,實現更高的計算並行度
-
突破單節點在IO / CPU上的瓶頸,充分利用分散式儲存的高吞吐能力
-
結合全域性節點管理與資源檢視,平衡排程全域性計算資源,實現負載均衡的同時保證查詢效能
-
結合全域性一致性檢視,保證對事務性資料的正確讀取

網際網路技術實戰營·資料智慧專題
關鍵詞
問題
元件
節點
結構
資料庫