讓關(guān)系型數(shù)據(jù)庫查詢再飛一會兒

背景

有一個系統(tǒng)的業(yè)務(wù)正在膨脹中琼讽,某一些報表(報表數(shù)據(jù)在mysql中)數(shù)據(jù)量增長比較厲害哗戈,報表頁面已經(jīng)處于卡爆了的狀態(tài)荒椭。中間經(jīng)過mysql本身的優(yōu)化,已經(jīng)到了當(dāng)前系統(tǒng)架構(gòu)+存儲模型的瓶頸笔链。本文提供一種優(yōu)化思路段只,拋磚引玉。

任務(wù)分析

以一條sql的優(yōu)化為例(這條sql里面的字段隨便改了改鉴扫,不保證正確性)赞枕。

SELECT d.col, COUNT(DISTINCT risk.inst_id) AS `count`
FROM risk
    INNER JOIN d
    ON d.inst_id = risk.inst_id
        AND d.id = risk.id
    INNER JOIN b
    ON b.business_key = d.id
        AND d.type = b.type
    INNER JOIN r
    ON risk.inst_id = r.inst_id
        AND risk.id = r.id
WHERE (r.visit_time >= '2018-10-27 00:00:00'
    AND r.visit_time <= '2018-11-28 15:54:40'
    AND d.id = '22821111115042'
    AND b.business_key = concat('22821111115042', ''))
GROUP BY d.col

其中,risk表大小112MB坪创,d表大小為9.5GB炕婶,b表208KB,r表大小為4.2GB莱预。這個報表的生成邏輯中含有較多inner join柠掂。經(jīng)過一些列的索引優(yōu)化之后,該條sql的查詢時間是36s依沮,前端體驗(yàn)仍然不是很好陪踩,且隨著報表時間范圍的拉長,用戶數(shù)據(jù)量的增長悉抵,查詢時間會持續(xù)惡化肩狂。
這里就不討論更改表結(jié)構(gòu)、遷移數(shù)據(jù)來優(yōu)化查詢了姥饰。

優(yōu)化思路

本身沒有太多技術(shù)難度傻谁,但中間經(jīng)過一段時間的摸索,直接說結(jié)論吧列粪,希望對有需要的同學(xué)帶來便利审磁。
用SparkSQL分布式計算的能力來加速查詢,SparkSQL原生支持通過jdbc連接外部存儲岂座。
首先态蒂,嘗試了直接在sparksql的jdbc連接中執(zhí)行上述sql,結(jié)果在意料之中费什,36秒左右钾恢。通過spark監(jiān)控頁面看到,該任務(wù)task數(shù)量為1,沒有并發(fā)起來瘩蚪,SparkSQL將查詢完全下推給mysql執(zhí)行泉懦。
那么問題來了,如何提升并發(fā)度呢疹瘦?
根據(jù)官方文檔崩哩,使用jdbc連接有這么幾個可用參數(shù),這些參數(shù)的含義參考附錄鏈接言沐。
numPartitions邓嘹,partitionColumnlowerBound险胰,upperBound
值得注意的是汹押,partitionColumn 必須為數(shù)值類型,日期或者時間戳鸯乃。lowerBoundupperBound必須為數(shù)字鲸阻。在上面的case中跋涣,我們可以對r表的visit_time進(jìn)行分區(qū)缨睡,并根據(jù)范圍設(shè)置上下界線。(時間戳轉(zhuǎn)化成long型)
分別在SparkSQL load這4張表陈辱,其中對r表的visit_time進(jìn)行分區(qū)奖年,并分別在SparkSQL中注冊臨時表,在SparkSQL內(nèi)執(zhí)行上述SQL沛贪,上述SQL執(zhí)行時間由36s降低到12s陋守,如果調(diào)調(diào)SparkSQL的參數(shù),性能可能會更好利赋。
這個方法從理論上來說水评,適用于任何單機(jī)關(guān)系型數(shù)據(jù)庫。

原理簡單剖析

這里是將SparkSQL作為一個分布式查詢引擎媚送,mysql作為SparkSQL的一種數(shù)據(jù)源中燥。SparkSQL內(nèi)部有高度的統(tǒng)一抽象(DataFrame/DataSet)。SparkSQL從mysql中抽取數(shù)據(jù)然后根據(jù)自身的邏輯來進(jìn)行運(yùn)算塘偎。如果對細(xì)節(jié)感興趣可以參考鏈接2疗涉。

參考文檔

[1] http://spark.apache.org/docs/latest/sql-data-sources-jdbc.html
[2] http://spark.apache.org/docs/latest/sql-programming-guide.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吟秩,隨后出現(xiàn)的幾起案子咱扣,更是在濱河造成了極大的恐慌,老刑警劉巖涵防,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闹伪,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)祭往,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門伦意,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人硼补,你說我怎么就攤上這事驮肉。” “怎么了已骇?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵离钝,是天一觀的道長。 經(jīng)常有香客問我褪储,道長卵渴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任鲤竹,我火速辦了婚禮浪读,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辛藻。我一直安慰自己碘橘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布吱肌。 她就那樣靜靜地躺著痘拆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪氮墨。 梳的紋絲不亂的頭發(fā)上纺蛆,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音规揪,去河邊找鬼桥氏。 笑死,一個胖子當(dāng)著我的面吹牛猛铅,可吹牛的內(nèi)容都是我干的字支。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼奕坟,長吁一口氣:“原來是場噩夢啊……” “哼祥款!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起月杉,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤刃跛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后苛萎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桨昙,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡检号,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛙酪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片齐苛。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖桂塞,靈堂內(nèi)的尸體忽然破棺而出凹蜂,到底是詐尸還是另有隱情,我是刑警寧澤阁危,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布玛痊,位于F島的核電站,受9級特大地震影響狂打,放射性物質(zhì)發(fā)生泄漏擂煞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一趴乡、第九天 我趴在偏房一處隱蔽的房頂上張望对省。 院中可真熱鬧,春花似錦晾捏、人聲如沸蒿涎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽同仆。三九已至萤捆,卻和暖如春裙品,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背俗或。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工市怎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辛慰。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓区匠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親帅腌。 傳聞我的和親對象是個殘疾皇子驰弄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容