數(shù)據(jù)庫索引和磁盤的關(guān)系大揭秘

一、序言
二撤嫩、磁盤結(jié)構(gòu)
三、磁盤中數(shù)據(jù)存儲(chǔ)
四蠢终、索引在磁盤中的存儲(chǔ)
五序攘、二級(jí)索引

一、序言

都說加索引能加快查詢的速度寻拂,其實(shí)通過索引本質(zhì)上是減少磁盤的讀取次數(shù)程奠,到底索引和磁盤的關(guān)系是怎樣的呢?


二祭钉、磁盤結(jié)構(gòu)

首先我們先了解一下操作系統(tǒng)是怎么從磁盤中讀取數(shù)據(jù)的瞄沙,操作系統(tǒng)通常是以頁為單位從磁盤中讀取數(shù)據(jù),磁盤可以理解為一個(gè)圓盤慌核,每個(gè)圓盤上有若干磁道距境。

比如下面的圖有4種不同顏色的磁道,每條磁道上每個(gè)半圓代表一個(gè)扇區(qū)垮卓,也就是一條磁道在這里被劃分為4個(gè)扇區(qū)垫桂。

1.jpg

操作系統(tǒng)從磁盤中讀取數(shù)據(jù)時(shí),也是按頁(扇區(qū))來讀取粟按,讀取一塊數(shù)據(jù)诬滩,我們稱之為1個(gè)block塊霹粥。

不同硬盤每個(gè)扇區(qū)的存儲(chǔ)容量不一樣。

  • 機(jī)械硬盤:每個(gè)扇區(qū)為512B疼鸟。
  • 固態(tài)硬盤(SSD):page大小為4KB后控。

備注:為什么要以頁為單位從磁盤讀取數(shù)據(jù)呢?
如果每次只查詢1條記錄空镜,由于磁盤檢索速度比較慢浩淘,會(huì)有一定的性能消耗。但如果每次讀一頁數(shù)據(jù)姑裂,會(huì)減少磁盤讀取的次數(shù)馋袜。


三、磁盤中數(shù)據(jù)存儲(chǔ)

假設(shè)有一張用戶表舶斧,表中共有用戶ID欣鳖、用戶名、密碼茴厉、頭像泽台、備注5個(gè)字段,字段長度如下:


2.jpg

根據(jù)字段長度定義矾缓,一條記錄的大小為128字節(jié)怀酷,而機(jī)械硬盤一個(gè)扇區(qū)最多能存儲(chǔ)512字節(jié),也就說是一次扇區(qū)掃描最多能讀取4條記錄嗜闻。

我們把從磁盤扇區(qū)讀取的數(shù)據(jù)稱之為1個(gè)block蜕依,

  • 一個(gè)block可以存儲(chǔ)512 / 128 = 4條記錄
  • 100條記錄則需要100 / 4 = 25個(gè)block

也就是說讀取user_id為100的記錄最多需要訪問25個(gè)block,也就是25次磁盤查詢琉雳。

如果說要讀取user_id為1000的記錄样眠,則最多需要進(jìn)行250次的磁盤查詢,如果數(shù)據(jù)量更大呢翠肘?這個(gè)時(shí)候索引的作用就出來了檐束。

四、索引在磁盤中的存儲(chǔ)

上面的例子中束倍,數(shù)據(jù)量越大被丧,磁盤查詢的的次數(shù)也就越多,我們可以做一個(gè)優(yōu)化绪妹,對(duì)user_id列加上索引甥桂。

3.png

上面我們說了假設(shè)該用戶表1條記錄占128字節(jié),1個(gè)block可以存放512 / 128 = 4條記錄邮旷。

現(xiàn)在對(duì)user_id列加上索引格嘁,該索引會(huì)保存該列的數(shù)據(jù)和數(shù)據(jù)指針(指向數(shù)據(jù)所在的磁盤扇區(qū))。

假設(shè)數(shù)據(jù)指針為6字節(jié)廊移,那么一條索引將占用該列長度10 + 6 = 16字節(jié)糕簿,1個(gè)block(512字節(jié))可以存放512 / 16 = 32條索引記錄探入。100條索引記錄需要占用100 / 32 = 4個(gè)block。

上面說了100條數(shù)據(jù)記錄需要占用100 / 4 = 25個(gè)block懂诗。以這100條數(shù)據(jù)為例蜂嗽,我們用4個(gè)block存索引數(shù)據(jù),25個(gè)block存儲(chǔ)列數(shù)據(jù)殃恒。

這個(gè)時(shí)候讀取user_id為100個(gè)記錄植旧,我們先掃描索引,最多讀取4個(gè)block就可以找到該數(shù)據(jù)所在磁盤扇區(qū)离唐,再經(jīng)過1次磁盤查詢就可以找到該數(shù)據(jù)病附,也就是說最多經(jīng)過5次磁盤查詢。

如果是讀取user_id為1000的記錄亥鬓,最多讀取32個(gè)block索引數(shù)據(jù)加上1個(gè)block列數(shù)據(jù)完沪,也就是33次磁盤查詢就能找到。

而且內(nèi)存訪問比磁盤快嵌戈,因?yàn)樗饕龜?shù)據(jù)比較小覆积,我們完全可以將索引數(shù)據(jù)加載到內(nèi)存,這樣訪問會(huì)更快熟呛。

備注:InnoDB中索引數(shù)據(jù)和列數(shù)據(jù)在同一個(gè)(.ibd)文件宽档,而索引數(shù)據(jù)總是在文件的最前面,查詢數(shù)據(jù)時(shí)先掃描索引庵朝。


五吗冤、二級(jí)索引

問題又來了,如果數(shù)據(jù)量越來越大九府,變成10w條椎瘟,100w條,就算建立10w條昔逗,100w條索引降传,速度還是會(huì)越來越慢篷朵,該怎么辦呢勾怒?

我們可以針對(duì)索引再見索引,什么意思呢声旺?


4.jpg

上面說了笔链,1000條數(shù)據(jù)需要構(gòu)建32個(gè)索引block,如果我們以32為單位腮猖,只存32條二級(jí)索引記錄鉴扫,再次構(gòu)建二級(jí)索引,則只需要1個(gè)索引block澈缺。(二級(jí)索引只存放user_id值為32及其倍數(shù)的數(shù)據(jù))

以這1000條數(shù)據(jù)為例坪创,我們用1個(gè)block存二級(jí)索引數(shù)據(jù)炕婶,32個(gè)block存1級(jí)索引數(shù)據(jù),250個(gè)block存列數(shù)據(jù)莱预。

這個(gè)時(shí)候如果讀取user_id為1000的記錄柠掂,只需要讀取1個(gè)二級(jí)索引block,1個(gè)一級(jí)索引塊依沮,再經(jīng)過1次磁盤查詢就能找到涯贞,也就是最多3次磁盤查詢。

當(dāng)然危喉,隨著數(shù)據(jù)量越來越大宋渔,二級(jí)索引數(shù)據(jù)也會(huì)越來越大,為了更好理解辜限,我們將它轉(zhuǎn)換為樹的形式皇拣,是不是覺得很熟悉。


5.jpg

當(dāng)然實(shí)際索引數(shù)據(jù)結(jié)構(gòu)列粪,像B+樹等多路平衡樹會(huì)更加復(fù)雜审磁,這個(gè)我們后面再分享。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岂座,一起剝皮案震驚了整個(gè)濱河市态蒂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌费什,老刑警劉巖钾恢,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸳址,居然都是意外死亡瘩蚪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門稿黍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疹瘦,“玉大人,你說我怎么就攤上這事巡球⊙糟澹” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵酣栈,是天一觀的道長险胰。 經(jīng)常有香客問我,道長矿筝,這世上最難降的妖魔是什么起便? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上榆综,老公的妹妹穿的比我還像新娘妙痹。我一直安慰自己,他們只是感情好鼻疮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布细诸。 她就那樣靜靜地躺著,像睡著了一般陋守。 火紅的嫁衣襯著肌膚如雪震贵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天水评,我揣著相機(jī)與錄音猩系,去河邊找鬼。 笑死中燥,一個(gè)胖子當(dāng)著我的面吹牛寇甸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播疗涉,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拿霉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咱扣?” 一聲冷哼從身側(cè)響起绽淘,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎闹伪,沒想到半個(gè)月后沪铭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡偏瓤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年杀怠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厅克。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赔退,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出证舟,到底是詐尸還是另有隱情硕旗,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布褪储,位于F島的核電站卵渴,受9級(jí)特大地震影響慧域,放射性物質(zhì)發(fā)生泄漏鲤竹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辛藻。 院中可真熱鬧碘橘,春花似錦、人聲如沸吱肌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氮墨。三九已至纺蛆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間规揪,已是汗流浹背桥氏。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猛铅,地道東北人字支。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像奸忽,于是被迫代替她去往敵國和親堕伪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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