mysql分表真得能提升查詢性能嗎

首先將存儲(chǔ)引擎限定在innodb

2種方式分表

  1. 水平分表彤恶,根據(jù)某一列或者某幾列將表按行分割到多張表中伟桅,達(dá)到減少每張表行數(shù)的目的
  2. 垂直分表退敦,將表的一些列拆分到多張表中伍俘,達(dá)到減少每張表列數(shù)的目的

分表真得能提升查詢性能嗎

分表分庫

如果將不同的表分到多個(gè)庫多個(gè)機(jī)器上邪锌,那一定是能提升性能的,畢竟你花錢買機(jī)器了癌瘾,總的可用CPU和內(nèi)存高了觅丰。這種情況不必考慮。

分表不分庫

如果所有分表都在同庫同機(jī)器上妨退,每個(gè)表的查詢都共用CPU和內(nèi)存妇萄,性能是怎么提升的?

1. 有索引的情況

例如這條查詢 select * from user_feeds where uid = ? 咬荷,且uid字段上有二級索引冠句,查詢步驟為:

  1. 確定索引的掃描范圍,即找到B+樹上uid=X的最左葉子節(jié)點(diǎn)和最右葉子節(jié)點(diǎn)幸乒,可能(不考慮已經(jīng)緩存到buffer pool中)需要進(jìn)行的最大IO次數(shù)為4(4層b+樹已經(jīng)可以存放巨量的數(shù)據(jù)了懦底,一般千萬級的是3層)
  2. 遍歷掃描范圍內(nèi)的索引數(shù)據(jù),取出主鍵id
  3. 通過主鍵id進(jìn)行回表查詢罕扎,IO次數(shù)最大值為掃描范圍內(nèi)索引記錄數(shù)量乘以聚簇索引中定位一條記錄的IO次數(shù)(B+樹層數(shù))

通過以上步驟可以看出聚唐,查詢的主要成本為:確定索引掃描范圍的IO次數(shù)(最大為4)、遍歷掃描范圍內(nèi)索引數(shù)據(jù)的CPU占用(與掃描范圍內(nèi)記錄數(shù)成正比)腔召、回表IO次數(shù)(與掃描范圍內(nèi)記錄數(shù)成正比杆查,且受聚簇索引B+樹層數(shù)影響)。所以查詢的成本主要取決于uid=X對應(yīng)的記錄數(shù)量和索引B+樹的層數(shù)宴咧。

來看一下分表后的查詢成本:

  1. 首先是確定索引掃描范圍的IO次數(shù)由B+樹的層數(shù)決定根灯,大部分情況下分表是會(huì)降低單表的樹的層數(shù),例如由4層降到3層掺栅,可以減少一次IO
  2. 掃描范圍內(nèi)記錄數(shù)不會(huì)變烙肺,所以遍歷掃描范圍內(nèi)索引數(shù)據(jù)的CPU占用不變
  3. 回表IO次數(shù),由于掃描范圍內(nèi)的記錄數(shù)不變氧卧,回表次數(shù)也不變桃笙,通過聚簇索引定位具體記錄數(shù)據(jù)IO次數(shù)可能會(huì)減少(同步驟1中普通索引確定掃描范圍的IO次數(shù)同理)

可見分表后主要的差別在于確定索引掃描范圍的IO次數(shù)和回表IO次數(shù),即分表后B+樹的層數(shù)變化沙绝,變化范圍為0到3搏明。對于不需要回表的查詢鼠锈,差別在于用到的索引B+樹層數(shù)變化導(dǎo)致的確定掃描范圍的IO次數(shù)變化;對于需要回表的查詢星著,除了確定掃描范圍的IO次數(shù)變化购笆,還有回表IO次數(shù)變化(回表IO次數(shù)變化=記錄數(shù)X聚簇索引B+樹層數(shù)變化)。

2. 全表掃描的情況

以上是有二級索引的情況虚循,如果沒有索引同欠,需要全表掃描時(shí),掃描整個(gè)聚簇索引的成本:加載數(shù)據(jù)頁到內(nèi)存的IO次數(shù)(聚簇索引的頁面數(shù))横缔、掃描記錄的CPU占用(整個(gè)聚簇索引的記錄數(shù)量)铺遂。分表以后所有表總的記錄數(shù)量不變,頁面數(shù)量也可以認(rèn)為不變茎刚。所以全表掃描的查詢性能分表與不分表也不會(huì)有什么差別襟锐。

3. 垂直分表能帶來性能提升嗎

垂直分表,表記錄數(shù)不會(huì)改變膛锭,每條記錄數(shù)據(jù)占用空間會(huì)變小粮坞,從而導(dǎo)致單表聚簇索引每個(gè)數(shù)據(jù)頁可以存儲(chǔ)的記錄變多,聚簇索引的數(shù)據(jù)頁數(shù)量變少泉沾,原來uid=X的記錄可能分布在N個(gè)數(shù)據(jù)頁上捞蚂,分表后uid=X的記錄分布在的數(shù)據(jù)頁數(shù)量<=N。也就是減少回表IO的次數(shù)跷究。

但是姓迅,這種情況只限于合理的垂直分表,也就是select的列可以落在同一張表中俊马。

4. 分表對寫操作的性能提升(待續(xù))

innodb索引數(shù)據(jù)大小估算

理論估算

索引列:uid丁存、created_at
單條記錄大小 uid4字節(jié)、created_at4字節(jié)柴我、主鍵post_id8字節(jié)解寝,頁號6字節(jié) 共22字節(jié)
單頁可以存放的記錄數(shù) 16kb(16384)/22 = 744,去除掉一些其他信息(header艘儒、槽信息)聋伦,再去除一些碎片(刪除造成的、沒填滿造成的)界睁,姑且認(rèn)為每頁存放500條記錄

如果總的記錄條數(shù)為5000w觉增,那么需要的葉子節(jié)點(diǎn)數(shù)量為 5000w/500 = 10w,B+樹需要兩層(500X500 = 25w)
索引葉子節(jié)點(diǎn)占用空間大小為 10wX16kb = 1.6GB
索引目錄節(jié)點(diǎn)占用空間大小為 500X16kb = 8M

實(shí)際業(yè)務(wù)場景中

測試環(huán)境

單條記錄大小 24
單頁可以存放的記錄數(shù) 682

與理論估算相近

// innodb統(tǒng)計(jì)信息查詢方法翻斟,注意sum_of_other_index_sizes代表的是所有二級索引占用的頁面數(shù)
select n_rows,'Secondary Indexes' AS 'BTrees',sum_of_other_index_sizes * 16384 AS Bytes,ROUND(sum_of_other_index_sizes * 16384 / n_rows) AS 'Bytes/row',sum_of_other_index_sizes AS Pages,ROUND(n_rows / sum_of_other_index_sizes) AS 'Rows/page' FROM innodb_table_stats where database_name = 'stt_post' and table_name = 'posts'
生產(chǎn)環(huán)境有限的信息
99.png

索引空間大小19.38GB逾礁,生產(chǎn)環(huán)境二級索引數(shù)量16個(gè),平均每個(gè)索引空間大小約1.1GB访惜,比理論估算還小一些嘹履。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腻扇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子砾嫉,更是在濱河造成了極大的恐慌幼苛,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焕刮,死亡現(xiàn)場離奇詭異蚓峦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)济锄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霍转,“玉大人荐绝,你說我怎么就攤上這事”芟” “怎么了低滩?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長岩喷。 經(jīng)常有香客問我恕沫,道長,這世上最難降的妖魔是什么纱意? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任婶溯,我火速辦了婚禮,結(jié)果婚禮上偷霉,老公的妹妹穿的比我還像新娘迄委。我一直安慰自己,他們只是感情好类少,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布叙身。 她就那樣靜靜地躺著,像睡著了一般硫狞。 火紅的嫁衣襯著肌膚如雪信轿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天残吩,我揣著相機(jī)與錄音财忽,去河邊找鬼。 笑死世剖,一個(gè)胖子當(dāng)著我的面吹牛定罢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旁瘫,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼祖凫,長吁一口氣:“原來是場噩夢啊……” “哼琼蚯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惠况,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤遭庶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后稠屠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峦睡,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年权埠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榨了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡攘蔽,死狀恐怖龙屉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情满俗,我是刑警寧澤转捕,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站唆垃,受9級特大地震影響五芝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辕万,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一枢步、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渐尿,春花似錦价捧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渔彰,卻和暖如春嵌屎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恍涂。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工宝惰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人再沧。 一個(gè)月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓尼夺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子淤堵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

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