8. sharding-jdbc源碼之結(jié)果合并總結(jié)

阿飛Javaer壹若,轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處,謝謝皂冰!

分頁性能分析

性能瓶頸

查詢偏移量過大的分頁會(huì)導(dǎo)致數(shù)據(jù)庫獲取數(shù)據(jù)性能低下店展,以MySQL為例:

SELECT * FROM t_order ORDER BY id LIMIT 1000000, 10

這句SQL會(huì)使得MySQL在無法利用索引的情況下跳過1000000條記錄后,再獲取10條記錄秃流,其性能可想而知赂蕴。而在分庫分表的情況下(假設(shè)分為2個(gè)庫),為了保證數(shù)據(jù)的正確性舶胀,SQL會(huì)改寫為:

SELECT * FROM t_order ORDER BY id LIMIT 0, 1000010

即將偏移量前的記錄全部取出概说,并僅獲取排序后的最后10條記錄。這會(huì)在數(shù)據(jù)庫本身就執(zhí)行很慢的情況下嚣伐,進(jìn)一步加劇性能瓶頸糖赔。因?yàn)樵璖QL僅需要傳輸10條記錄至客戶端,而改寫之后的SQL則會(huì)傳輸1000010*2的記錄至客戶端纤控。

Sharding-JDBC的優(yōu)化

Sharding-JDBC進(jìn)行了2個(gè)方面的優(yōu)化挂捻。

首先,Sharding-JDBC采用流式處理 + 歸并排序的方式來避免內(nèi)存的過量占用船万。Sharding-JDBC的SQL改寫刻撒,不可避免的占用了額外的帶寬,但并不會(huì)導(dǎo)致內(nèi)存暴漲耿导。
與直覺不同声怔,大多數(shù)人認(rèn)為Sharding-JDBC會(huì)將1000010*2記錄全部加載至內(nèi)存,進(jìn)而占用大量內(nèi)存而導(dǎo)致內(nèi)存溢出舱呻。
但由于每個(gè)結(jié)果集的記錄是有序的醋火,因此Sharding-JDBC每次比較僅獲取各個(gè)分片的當(dāng)前結(jié)果集記錄,駐留在內(nèi)存中的記錄僅為當(dāng)前路由到的分片的結(jié)果集的當(dāng)前游標(biāo)指向而已箱吕。
對(duì)于本身即有序的待排序?qū)ο蠼娌担瑲w并排序的時(shí)間復(fù)雜度僅為O(n),性能損耗很小茬高。

其次兆旬,Sharding-JDBC對(duì)僅落至單分片的查詢進(jìn)行進(jìn)一步優(yōu)化。落至單分片查詢的請(qǐng)求并不需要改寫SQL也可以保證記錄的正確性怎栽,因此在此種情況下丽猬,Sharding-JDBC并未進(jìn)行SQL改寫宿饱,從而達(dá)到節(jié)省帶寬的目的。

更好的分頁解決方案

由于LIMIT并不能通過索引查詢數(shù)據(jù)脚祟,因此如果可以保證ID的連續(xù)性谬以,通過ID進(jìn)行分頁是比較好的解決方案:

SELECT * FROM t_order WHERE id > 100000 AND id <= 100010 ORDER BY id

或通過記錄上次查詢結(jié)果的最后一條記錄的ID進(jìn)行下一頁的查詢:

SELECT * FROM t_order WHERE id > 100000 LIMIT 10

摘自:sharding-jdbc使用指南?分頁及子查詢

是否需要這種分頁

無論是SELECT * FROM t_order ORDER BY id LIMIT 0, 100010或者SELECT * FROM t_order WHERE id > 100000 LIMIT 10,性能都一般般由桌,后者只是稍微好點(diǎn)而已为黎,但是由于LIMIT的存在,mysql都需要排序沥寥;

是否能從產(chǎn)品角度或者用戶習(xí)慣等方面解決或者避免這個(gè)問題碍舍?

  • 用戶習(xí)慣結(jié)合產(chǎn)品需求解決方案:

比如我們以前有個(gè)每日TOP榜單需求,分析用戶行為一般不會(huì)無限制往下滑邑雅,即使有這種用戶片橡,也是極少數(shù),可以忽略淮野。這樣的話捧书,可以通過SQL*** LIMIT 300只查詢10頁總計(jì)300個(gè)TOP應(yīng)用,然后把這些數(shù)據(jù)以list結(jié)構(gòu)保存到redis中骤星。這樣的話经瓷,用戶查看每日TOP榜單只需通過LRANGE key start stop從redis緩存中取數(shù)據(jù)即可,且限制查詢的offset不允許超過300洞难;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舆吮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子队贱,更是在濱河造成了極大的恐慌色冀,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柱嫌,死亡現(xiàn)場(chǎng)離奇詭異锋恬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)编丘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門与学,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嘉抓,你說我怎么就攤上這事索守。” “怎么了抑片?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蕾盯,是天一觀的道長。 經(jīng)常有香客問我蓝丙,道長级遭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任渺尘,我火速辦了婚禮挫鸽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸥跟。我一直安慰自己丢郊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布医咨。 她就那樣靜靜地躺著枫匾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拟淮。 梳的紋絲不亂的頭發(fā)上干茉,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音很泊,去河邊找鬼角虫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛委造,可吹牛的內(nèi)容都是我干的戳鹅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼昏兆,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼枫虏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起爬虱,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤隶债,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后饮潦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體燃异,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年继蜡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了回俐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稀并,死狀恐怖仅颇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碘举,我是刑警寧澤忘瓦,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站引颈,受9級(jí)特大地震影響耕皮,放射性物質(zhì)發(fā)生泄漏境蜕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一凌停、第九天 我趴在偏房一處隱蔽的房頂上張望粱年。 院中可真熱鬧,春花似錦罚拟、人聲如沸台诗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拉队。三九已至,卻和暖如春阻逮,著一層夾襖步出監(jiān)牢的瞬間粱快,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來泰國打工夺鲜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留皆尔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓币励,卻偏偏與公主長得像慷蠕,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子食呻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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