PolarDB-X包含計(jì)算節(jié)點(diǎn)(CN)和數(shù)據(jù)節(jié)點(diǎn)(DN),CN負(fù)責(zé)SQL解析、優(yōu)化和執(zhí)行,DN節(jié)負(fù)責(zé)數(shù)據(jù)的持久化,CN與DN之間通過RPC通信。DN 100%兼容Mysql,也是作為PolarDB-X標(biāo)準(zhǔn)版進(jìn)行售賣的。
CN與DN之間RPC通信的內(nèi)容其實(shí)就是標(biāo)準(zhǔn)的SQL,CN會(huì)將解析優(yōu)化好的語法樹轉(zhuǎn)成SQL傳給DN重新解析、優(yōu)化。對(duì)比起來,將CN的語法樹直接傳給DN執(zhí)行聽起來就更優(yōu)。
但這樣其實(shí)不一定好,主要原因是作為存算分離的架構(gòu),數(shù)據(jù)都在DN上,DN可以直接在數(shù)據(jù)上進(jìn)行index dive,而CN的統(tǒng)計(jì)信息是采樣出來的靜態(tài)數(shù)據(jù),更新不及時(shí),所以基數(shù)估計(jì)比不上DN精確,導(dǎo)致索引選擇準(zhǔn)確度不如DN,在很多場景下節(jié)省的DN解析優(yōu)化的消耗遠(yuǎn)不如選錯(cuò)索引的后果。
但對(duì)于用戶核心的點(diǎn)查場景,這樣的CN優(yōu)化一遍DN再優(yōu)化一遍的流程就會(huì)成為瓶頸,所以PolarDB-X提供XPlan機(jī)制:對(duì)于點(diǎn)查場景,直接傳輸執(zhí)行計(jì)劃交給DN執(zhí)行。
這樣的定位說明XPlan不是必須的能力,而是錦上添花的能力。目前XPlan的適用范圍被限定為單張表的DQL,只支持Scan、Filter和Project算子。
XPlan在Sysbench點(diǎn)查上有10%以上的提升,但線上在用戶的真實(shí)場景下XPlan索引錯(cuò)選導(dǎo)致的慢查詢問題頻發(fā)。對(duì)于PolarDB-X來說,選錯(cuò)索引有兩種可能:基數(shù)估計(jì)錯(cuò)誤和執(zhí)行計(jì)劃緩存下的傾斜索引。
基數(shù)估計(jì)錯(cuò)誤的三個(gè)常見原因統(tǒng)計(jì)信息缺失、傾斜數(shù)據(jù)和關(guān)聯(lián)列,學(xué)術(shù)界、工業(yè)界研究了幾十年都無法解決[2]。這些問題雖然無法解決,但是很容易檢測到,PolarDB-X基本策略是檢測到這些問題就禁用XPlan,交給DN做局部索引選擇。同樣發(fā)現(xiàn)索引錯(cuò)選也是容易的。通過預(yù)先和事后的檢測,希望盡量減少XPlan錯(cuò)選概率。