最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

32 一文總結(jié)初步了解到的MySQL存儲(chǔ)模型以及數(shù)據(jù)讀寫(xiě)機(jī)制

2023-06-22 10:57 作者:儒猿課堂  | 我要投稿

一文總結(jié)初步了解到的MySQL存儲(chǔ)模型以及數(shù)據(jù)讀寫(xiě)機(jī)制


今天我們來(lái)用一篇文章初步總結(jié)一下我們近期學(xué)習(xí)到的MySQL存儲(chǔ)模型以及對(duì)應(yīng)的讀寫(xiě)機(jī)制,其實(shí)大家通過(guò)近期的學(xué)習(xí)也僅僅是初步了解了MySQL底層數(shù)據(jù)的存儲(chǔ)模型而已,因?yàn)楹罄m(xù)我們還要講解MySQL的增刪改查執(zhí)行背后的深入底層的各種存儲(chǔ)數(shù)據(jù)讀寫(xiě)細(xì)節(jié),現(xiàn)在僅僅是初步把存儲(chǔ)模型的結(jié)構(gòu)給建立起來(lái)罷了。


好,那么我們現(xiàn)在應(yīng)該都知道了,最終MySQL的數(shù)據(jù)都是放在磁盤文件里的,這個(gè)大家應(yīng)該都沒(méi)什么問(wèn)題吧


那么數(shù)據(jù)在磁盤文件里是怎么存放的呢?我們都知道我們平時(shí)數(shù)據(jù)都是插入一個(gè)一個(gè)的表中的,而表是個(gè)邏輯概念,其實(shí)在物理層面,他對(duì)應(yīng)的是表空間這個(gè)概念。


所以其實(shí)在MySQL的磁盤上,表空間就對(duì)應(yīng)著磁盤文件,在磁盤文件里就存放著數(shù)據(jù)!


那么這個(gè)表空間的磁盤文件里,數(shù)據(jù)是如何組織的呢?


這個(gè)就非常的復(fù)雜了!因?yàn)槟憧梢韵胂笠幌?,假如讓你把?shù)據(jù)直接一行一行的寫(xiě)入一個(gè)磁盤文件,當(dāng)然很簡(jiǎn)單了!


但是問(wèn)題是你現(xiàn)在要存儲(chǔ)的是數(shù)據(jù)庫(kù)里的如此復(fù)雜的數(shù)據(jù)!他里面是有各種字段類型的,還有索引這個(gè)概念,當(dāng)后面我們講到索引的時(shí)候,就會(huì)詳細(xì)分析這個(gè)索引在磁盤里的數(shù)據(jù)組織結(jié)構(gòu),這也是相當(dāng)?shù)膹?fù)雜。


所以其實(shí)在磁盤文件里存放的數(shù)據(jù),他從最基本的角度來(lái)看的話,就是被拆分為一個(gè)一個(gè)的數(shù)據(jù)區(qū)(extent)分組,以后我們干脆就用他的英文名叫做extent組好了,每個(gè)extent組中包含256個(gè)extent,然后每個(gè)extent里包含64個(gè)數(shù)據(jù)頁(yè)!然后每個(gè)數(shù)據(jù)頁(yè)里都包含了一行一行的數(shù)據(jù)!如下圖所示。

? ? ? ? ? ?

? ? ? ? ? ? ?

大家聽(tīng)到這里,是不是覺(jué)得特別的簡(jiǎn)單,其實(shí)絕對(duì)不是的


在實(shí)際存儲(chǔ)的時(shí)候,我們之前稍微給大家介紹過(guò)一點(diǎn)點(diǎn),在數(shù)據(jù)行里都有很多附加的信息,在數(shù)據(jù)頁(yè)、數(shù)據(jù)區(qū)里,都有很多附加的特殊信息。各種各樣的特殊信息,就可以讓我們?cè)诤?jiǎn)簡(jiǎn)單單的磁盤文件里實(shí)現(xiàn)B+樹(shù)索引、事務(wù)之類的非常復(fù)雜的機(jī)制。


關(guān)于這些存儲(chǔ)結(jié)構(gòu)中的特殊信息是如何用于支撐實(shí)現(xiàn)很多高級(jí)的復(fù)雜功能的,我們后續(xù)會(huì)給大家講解的!


那么現(xiàn)在問(wèn)題來(lái)了,我們都知道,當(dāng)我們?cè)跀?shù)據(jù)庫(kù)中執(zhí)行crud的時(shí)候,你必須先把磁盤文件里的一個(gè)數(shù)據(jù)頁(yè)加載到內(nèi)存的Buffer Pool的一個(gè)緩存頁(yè)里去,然后我們?cè)鰟h改查都是針對(duì)緩存頁(yè)里的數(shù)據(jù)來(lái)執(zhí)行的!


所以假設(shè)此時(shí)我們要插入一條數(shù)據(jù),那么是選擇磁盤文件里的哪個(gè)數(shù)據(jù)頁(yè)加載到緩存頁(yè)里去呢?


大家注意,這里要?jiǎng)澲攸c(diǎn)了,其實(shí)這個(gè)時(shí)候會(huì)看看你往哪個(gè)表里插入數(shù)據(jù)?然后肯定得根據(jù)表找到一個(gè)表空間啊!


找到表空間之后,就可以定位到對(duì)應(yīng)的磁盤文件啊!有了磁盤文件之后,就可以從里面找一個(gè)extent組,找一個(gè)extent,接著從里面找一個(gè)數(shù)據(jù)頁(yè)出來(lái)!這個(gè)數(shù)據(jù)也可能是空的,也可能已經(jīng)放了一些數(shù)據(jù)行了!


然后就可以把這個(gè)數(shù)據(jù)頁(yè)從磁盤里完整加載出來(lái),放入Buffer Pool的緩存頁(yè)里了!


我們看下圖的示意

? ? ? ? ? ?

? ? ? ? ? ? ?

當(dāng)然,這個(gè)時(shí)候有人會(huì)問(wèn)了,這個(gè)從磁盤文件里讀取一個(gè)數(shù)據(jù)頁(yè),是怎么讀取的???


其實(shí)這個(gè)很簡(jiǎn)單了,你可以想一下,磁盤文件里放的數(shù)據(jù)都是緊挨在一起的,類似于下面的那種樣子。


0xdfs3439399abc0sfsdkslf9sdfpsfds0xdfs3439399abc0sfsdkslf9sdfpsfds

0xdfs3439399abc0sfsdkslf9sdfpsfds0xdfs3439399abc0sfsdkslf9sdfpsfds


其實(shí)上述字符完全無(wú)任何意義,就是我為了演示隨便搞出來(lái)的一段東西而已,但是大致來(lái)說(shuō)磁盤里存放的數(shù)據(jù)看起來(lái)就是那樣的,可能先是有一個(gè)extent組開(kāi)始的一些東西,然后里面是一個(gè)一個(gè)的extent,每個(gè)extent開(kāi)始的時(shí)候會(huì)寫(xiě)一些特殊的信息,然后再是一個(gè)一個(gè)的數(shù)據(jù)頁(yè),里面是一個(gè)一個(gè)的數(shù)據(jù)行。


那么在讀取一個(gè)數(shù)據(jù)頁(yè)的時(shí)候,你就可以通過(guò)隨機(jī)讀寫(xiě)的方式來(lái)了,舉個(gè)例子,我們下面有一個(gè)偽代碼,大家看看。就是設(shè)置一下要從一個(gè)數(shù)據(jù)文件的哪個(gè)位置開(kāi)始讀取,一直到哪個(gè)位置就結(jié)束。


dataFile.setStartPosition(25347)

dataFile.setEndPosition(28890)

dataPage = dataFile.read()


通過(guò)上面?zhèn)未a那種方式,你指定磁盤文件里的開(kāi)始和截止的位置,就能讀取出來(lái)指定位置的一段數(shù)據(jù),比如讀取出來(lái)一大坨東西:psfds0xdfs343939。也許這坨東西就是一個(gè)數(shù)據(jù)頁(yè)包含的內(nèi)容了。


然后把數(shù)據(jù)頁(yè)放到內(nèi)存的緩存頁(yè)里即可。


接著crud操作都可以直接針對(duì)緩存頁(yè)去執(zhí)行了,會(huì)自動(dòng)把更新的緩存頁(yè)加入flush鏈表,然后更新他在lru鏈表里的位置,包括更新過(guò)的緩存頁(yè)會(huì)從free鏈表里拿出來(lái),等等,后續(xù)一系列操作,都是之前我們分析過(guò)的了。


此時(shí)對(duì)于那些被更新過(guò)的緩存頁(yè)來(lái)說(shuō),都會(huì)由后臺(tái)線程刷入磁盤的,那么刷磁盤的時(shí)候是怎么刷呢?我們也是寫(xiě)一段偽代碼給大家看看。


dataFile.setStartPosition(25347)

dataFile.setEndPosition(28890)

dataFile.write(cachePage)


因?yàn)橐粋€(gè)數(shù)據(jù)頁(yè)的大小其實(shí)是固定的,所以一個(gè)數(shù)據(jù)頁(yè)固定就是可能在一個(gè)磁盤文件里占據(jù)了某個(gè)開(kāi)始位置到結(jié)束位置的一段數(shù)據(jù),此時(shí)你寫(xiě)回去的時(shí)候也是一樣的,選擇好固定的一段位置的數(shù)據(jù),直接把緩存頁(yè)的數(shù)據(jù)寫(xiě)回去,就覆蓋掉了原來(lái)的那個(gè)數(shù)據(jù)頁(yè)了,就如上面的偽代碼示意。


今天通過(guò)一篇總結(jié)文章,就給大家講清楚了我們初步了解到的存儲(chǔ)模型是如何跟Buffer Pool緩存機(jī)制配合起來(lái)實(shí)現(xiàn)crud的,接著我們會(huì)給大家講解幾個(gè)數(shù)據(jù)庫(kù)優(yōu)化的案例了!


我們的風(fēng)格就是講一些理論的知識(shí),就配合一些實(shí)戰(zhàn)案例,讓大家理論和實(shí)戰(zhàn)相結(jié)合起來(lái)。

End


專欄版權(quán)歸公眾號(hào)儒猿技術(shù)窩所有

未經(jīng)許可不得傳播,如有侵權(quán)將追究法律責(zé)任

32 一文總結(jié)初步了解到的MySQL存儲(chǔ)模型以及數(shù)據(jù)讀寫(xiě)機(jī)制的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
淮滨县| 新邵县| 延吉市| 石首市| 鹤庆县| 民勤县| 五常市| 武安市| 华阴市| 阳泉市| 鹤庆县| 会理县| 宁安市| 安庆市| 龙山县| 双牌县| 喜德县| 荔浦县| 台南市| 闸北区| 岚皋县| 宁远县| 都匀市| 东辽县| 黑水县| 自贡市| 东乡| 灵璧县| 大余县| 无锡市| 汾阳市| 南昌县| 神池县| 海兴县| 江北区| 潜山县| 奉贤区| 娱乐| 于田县| 渭源县| 邢台市|