日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

MySQL InnoDB行記錄存儲(chǔ)結(jié)構(gòu)分析

瀏覽:504日期:2023-06-28 19:41:17
目錄數(shù)據(jù)表的文件構(gòu)成表空間的組成結(jié)構(gòu)段區(qū)頁(yè)行InnoDB 行格式類型Compact 行格式圖解記錄的額外信息記錄的真實(shí)數(shù)據(jù)總結(jié)數(shù)據(jù)表的文件構(gòu)成

Mysql的存儲(chǔ)行為是由Innodb存儲(chǔ)引擎去具體實(shí)現(xiàn)的,在windows下安裝Mysql后有data(數(shù)據(jù)庫(kù)存放的地方)的文件夾,linux一般在/var/lib/mysql文件件。

創(chuàng)建數(shù)據(jù)庫(kù)和表后我們可以在data目錄先看到數(shù)據(jù)庫(kù)對(duì)應(yīng)名稱文件夾,文件夾有opt、frm、ibd三種文件:

db.opt,用來(lái)存儲(chǔ)當(dāng)前數(shù)據(jù)庫(kù)的默認(rèn)字符集和字符校驗(yàn)規(guī)則。demo1.frm ,t_order 的表結(jié)構(gòu)會(huì)保存在這個(gè)文件demo1.ibd,t_order 的表數(shù)據(jù)會(huì)保存在這個(gè)文件。表數(shù)據(jù)既可以存在共享表空間文件(文件名:ibdata1,在data目錄下)里,也可以存放在獨(dú)占表空間文件(文件名:表名字.ibd)

表空間的組成結(jié)構(gòu)

先看圖,先對(duì)表空間結(jié)構(gòu)做個(gè)大概了解,形成一個(gè)概念

InnoDB存儲(chǔ)引擎中,對(duì)段的管理都是由引擎自身所完成,我們已看到段有幾種類型,它是不同類型的區(qū)組成的集合,一般分為索引段(B+樹(shù)非葉子節(jié)點(diǎn)區(qū))、數(shù)據(jù)段(B+樹(shù)非葉子節(jié)點(diǎn)區(qū))、回滾段(回滾數(shù)據(jù)區(qū))。

也就是說(shuō)InnoDB 對(duì) B+ 樹(shù)的葉節(jié)點(diǎn)和葉子節(jié)點(diǎn)進(jìn)行了區(qū)別對(duì)待,也就是說(shuō)葉子節(jié)點(diǎn)有自己獨(dú)有的區(qū),非葉子節(jié)點(diǎn)也有自己獨(dú)有的區(qū),如果不區(qū)分葉子節(jié)點(diǎn)和非葉子節(jié)點(diǎn),統(tǒng)統(tǒng)把節(jié)點(diǎn)代表的頁(yè)面放到申請(qǐng)到的區(qū)中的話,進(jìn)行范圍掃描的效率就大幅降低,而不同的區(qū)的集合就組成了不同的段。

區(qū)

我們知道B+樹(shù)的每一層中的頁(yè)都會(huì)形成一個(gè)雙向鏈表,如果是以頁(yè)為單位來(lái)分配存儲(chǔ)空間的話,雙向鏈表相鄰的兩個(gè)頁(yè)之間的物理位置可能不是連續(xù)的,也許離得非常遠(yuǎn),這種情況下進(jìn)行 隨機(jī)I/O 是會(huì)很慢的。

因此,應(yīng)該盡量讓鏈表中相鄰的頁(yè)的物理位置也相鄰,這樣進(jìn)行范圍查詢的時(shí)候才可以使用所謂的 順序I/O。

區(qū)在物理位置上由連續(xù)的64個(gè)頁(yè)組成,InnoDB 中的頁(yè)大小默認(rèn)是 16KB,所以一個(gè)區(qū)的大小是 64*16KB= 1MB,這樣使得頁(yè)的雙向鏈表在物理位置也是相鄰的,從而進(jìn)行順序I/O,加快了查詢效率!

在表數(shù)據(jù)量大的時(shí)候,為某個(gè)索引分配空間的時(shí)候就不再按照頁(yè)為單位分配了,而是按區(qū)為單位分配,甚至在表中的數(shù)據(jù)特別多的時(shí)候,可以一次性分配多個(gè)連續(xù)的區(qū)。

頁(yè)

Innodb讀取數(shù)據(jù)的時(shí)候,并不是按照行來(lái)讀取數(shù)據(jù)的,InnoDB 的數(shù)據(jù)是按【頁(yè)】為單位來(lái)讀寫(xiě)的,當(dāng)需要讀一條記錄的時(shí)候,并不是將這個(gè)行記錄從磁盤(pán)讀出來(lái),而是以頁(yè)為單位,將其整體讀入內(nèi)存。

InnoDB 的數(shù)據(jù)是按【頁(yè)】為單位來(lái)讀寫(xiě)的,也就是說(shuō),當(dāng)需要讀一條記錄的時(shí)候,并不是將這個(gè)行記錄從磁盤(pán)讀出來(lái),而是以頁(yè)為單位,將其整體讀入內(nèi)存。默認(rèn)每個(gè)頁(yè)的大小為 16KB,也就是最多能保證 16KB 的連續(xù)存儲(chǔ)空間。頁(yè)是 InnoDB 存儲(chǔ)引擎磁盤(pán)管理的最小單元,數(shù)據(jù)庫(kù)每次讀寫(xiě)都是以【頁(yè)】為單位的,一次最少?gòu)拇疟P(pán)中讀取 16K 的內(nèi)容到內(nèi)存中。行

MySQL也是以【行 row】進(jìn)行存儲(chǔ)的,圖中對(duì)于行的描畫(huà)圖是 COMPACT格式,這也是重點(diǎn)需要了解的格式,而不同的行格式,存儲(chǔ)的結(jié)構(gòu)也不同。

InnoDB 行格式類型

行格式:就是記錄在磁盤(pán)上的存放形式或者說(shuō)存儲(chǔ)結(jié)構(gòu)

InnoDB 存儲(chǔ)引擎設(shè)計(jì)了 4 種行格式,分別是 Redundant、Compact、Dynamic和 Compressed ,后三個(gè)都是緊湊型行格式,為的是存放更多的行記錄。

Redundant 行格式比較古老了, MySQL 5.0 版本之前用的行格式,現(xiàn)在基本不用了,我們知道有這個(gè)格式就行了

Compact 行格式在MySQL 5.0 之后引入,在MySQL5.1版本中,默認(rèn)設(shè)置為Compact行格式,一條完整的記錄其實(shí)可以被分為記錄的額外信息和記錄的真實(shí)數(shù)據(jù)兩大部分。

Dynamic 和 Compressed 它們的行格式都和 Compact 挺像,只是在 處理溢出列數(shù)據(jù)和Compact不同 ,MySQL5.7 版本之后,默認(rèn)使用 Dynamic 行格式。

Compact 行格式圖解

從上面我們知道Compact和Dynamic 和 Compressed很像,那么我們就Compact行格式展開(kāi)進(jìn)一步了解,了解了Compact就等同于對(duì)其他也做了了解。

從圖中我們可以看到Compact行格式下,一條記錄分為 【記錄的額外信息】和【記錄的真實(shí)數(shù)據(jù)】?jī)刹糠郑覀兊牧袛?shù)據(jù)是在真實(shí)數(shù)據(jù)部分,我們?cè)俜謩e對(duì)這些內(nèi)容進(jìn)行更具體的描述。

記錄的額外信息

額外信息為的是更好的管理記錄,分為變長(zhǎng)字段長(zhǎng)度列表、NULL值列表、記錄頭信息

我們來(lái)創(chuàng)建一個(gè)表來(lái)看看變長(zhǎng)字段具體是存的,表結(jié)構(gòu)如下,行格式 Compact,本文對(duì)于行記錄的實(shí)際存儲(chǔ)案例基于這張表:

CREATE TABLE `demo1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `col1` varchar(45) COLLATE utf8_bin DEFAULT NULL, `col2` varchar(45) COLLATE utf8_bin DEFAULT NULL, `col3` int(11) DEFAULT NULL, `col4` char(5) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=ascii ROW_FORMAT=COMPACT;

并插入三條數(shù)據(jù),demo1表中的各個(gè)列都使用的是ascii字符集(每個(gè)字符只需要1個(gè)字節(jié)來(lái)進(jìn)行編碼)

1:變長(zhǎng)字段列信息

針對(duì)VARCHAR、TEXT、BLOB這類變長(zhǎng)字段,列中實(shí)際存儲(chǔ)了多少數(shù)據(jù)是不固定的,因此除了要把數(shù)據(jù)本身存下來(lái),還需要記下它的長(zhǎng)度,COMPACT將變長(zhǎng)列的實(shí)際長(zhǎng)度按照字段的順序,逆序存儲(chǔ)在變長(zhǎng)字段長(zhǎng)度列表里。

變長(zhǎng)字段存儲(chǔ)空間分為兩部分:真正的數(shù)據(jù)部分、該數(shù)據(jù)占用的字節(jié)數(shù)

從demo1表的第一條記錄來(lái)看各個(gè)字段占用的字節(jié)數(shù),因?yàn)槭亲冮L(zhǎng)字段, id、col3(int)、col(char)這三個(gè)字段可以不用管

clo1字段是varchar ,值是zs,占用兩個(gè)字節(jié)的空間,十六進(jìn)制 0x02;clo2字段是varchar ,值是lsa,占用三個(gè)字節(jié)的空間,十六進(jìn)制 0x03;

第一行行記錄填入變長(zhǎng)字段長(zhǎng)度列表后的示意圖如下:

逆序排列的目的是為了讓位置靠前的記錄的真實(shí)數(shù)據(jù)和數(shù)據(jù)對(duì)應(yīng)的字段長(zhǎng)度信息可以同時(shí)在一個(gè) CPU Cache Line 中,這樣就可以提高 CPU Cache 的命中率

2:NULL值列表

當(dāng)某些字段是null值時(shí),才顯示在null值列表null值列表是通過(guò)bit位來(lái)進(jìn)行標(biāo)識(shí)的,一個(gè)字段占一個(gè)比特位,bit位按字段逆序排列字段值為null的bit位為1,否則為0null 值列表必須用整數(shù)個(gè)字節(jié)的位表示(1字節(jié)8位),如果使用的二進(jìn)制位個(gè)數(shù)不足整數(shù)個(gè)字節(jié),則在字節(jié)的高位補(bǔ) 0

要注意的是null值列表并不是固定的1個(gè)字節(jié),如果一條記錄中有9個(gè)字段的值都是null,那么null值列表大小將是兩個(gè)字節(jié)大小,依次類推。

結(jié)合這些特性,我們來(lái)看看一條記錄中存在null值和不存在null值在null值列表中的樣子,我們記錄使用上面表demo1的結(jié)構(gòu)和數(shù)據(jù),其中id是主鍵不能為null,不在討論范圍內(nèi),表中null字段不超過(guò)8個(gè),這三條記錄對(duì)應(yīng)的null值列表如下:

第一條記錄:

第二條記錄:

第三條記錄:

3:記錄頭信息

記錄頭其實(shí)包含了很多信息,如圖,我們著重了解紅色部分幾個(gè)比較重要的。

delete_flag :刪除標(biāo)記 0未刪除、1已刪除,我們執(zhí)行 detele 刪除記錄的時(shí)候,并不會(huì)真正的刪除記錄,只是將這個(gè)記錄的 delete_flag 標(biāo)記為 1。 (所有的被刪除掉的記錄會(huì)組成一個(gè)垃圾鏈表,記錄在這個(gè)鏈表中占用的空間被稱為可重用空間。之后若是有新的記錄插入到表中,它們就可以覆蓋掉被刪除的這些記錄占用的存儲(chǔ)空間了)next_record:記錄與記錄之間是通過(guò)鏈表組織的,它表示當(dāng)前記錄的真實(shí)數(shù)據(jù)到下一條記錄的真實(shí)數(shù)據(jù)的距離,指向的是下一條記錄的「記錄頭信息」和「真實(shí)數(shù)據(jù)」之間的位置。 這個(gè)位置剛好向左讀就是記錄頭信息,向右讀就是真實(shí)數(shù)據(jù),該值為【正】表示下一條記錄在它的后面,為【負(fù)】表示下一條記錄在它的前面(這里都是按字節(jié)去找位置)record_type:表示當(dāng)前記錄的類型,0:表示普通記錄,1:表示B+樹(shù)非葉子節(jié)點(diǎn)記錄,2:表示最小記錄(Infimum),3:表示最大記錄(Supremum)記錄的真實(shí)數(shù)據(jù)

我們看隱藏字段 row_id、trx_id、roll_ptr 感覺(jué)是不是在哪里遇到過(guò),只要你了解過(guò)Mysql的MVCC機(jī)制就很熟悉這幾個(gè)字段

row_id:如果我們指定了主鍵或者唯一約束列,那么就沒(méi)有 row_id 隱藏字段了。如果既沒(méi)有指定主鍵,又沒(méi)有唯一約束,InnoDB 才會(huì)為記錄添加 row_id 隱藏字段。row_id不是必需的,占用 6 個(gè)字節(jié)。trx_id:記錄創(chuàng)建這條記錄/最后一次修改該記錄的事務(wù) ID, trx_id是必需的,占用 6 個(gè)字節(jié)。roll_ptr:回滾指針,記錄的是記錄上一個(gè)版本的指針,roll_ptr 是必需的,占用 7 個(gè)字節(jié)。

其他字段就是我們創(chuàng)建表的時(shí)候定義的各個(gè)列字段了。

總結(jié)

通篇下來(lái),感覺(jué)對(duì)InnoDB實(shí)際的存儲(chǔ)結(jié)構(gòu)有了更深的認(rèn)識(shí),當(dāng)然也會(huì)產(chǎn)生不少問(wèn)題,比如:

1:一行記錄除了 TEXT、BLOBs 類型的列,限制最大為 65535 字節(jié),那么能具體分析分析嗎?

2:行溢出了會(huì)怎么樣,因?yàn)橐豁?yè)就16kb,16384字節(jié),是小于65535 字節(jié)的

3:為什么設(shè)計(jì)表的時(shí)候字段會(huì)選擇not null?

等等,這些問(wèn)題將會(huì)在下次進(jìn)行總結(jié),就不在這里用大篇幅展開(kāi)了。

到此這篇關(guān)于MySQL InnoDB行記錄存儲(chǔ)結(jié)構(gòu)分析的文章就介紹到這了,更多相關(guān)MySQL InnoDB存儲(chǔ)結(jié)構(gòu)內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: MySQL 數(shù)據(jù)庫(kù)
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
红杏一区二区三区| 精品中文字幕一区二区三区 | 国产在线不卡| 999久久久亚洲| 韩国一区二区三区视频| 久久精品国产亚洲aⅴ| 丁香婷婷久久| 日韩精品dvd| 99久久99视频只有精品| 99久久久国产精品美女| 欧美精品一线| 亚洲精选久久| 国产精品亚洲片在线播放| 久久亚洲人体| 欧美成a人免费观看久久| 午夜国产精品视频| 蜜臀av性久久久久蜜臀aⅴ流畅 | 午夜精品婷婷| 亚洲视频国产| 久久的色偷偷| 久久天堂av| 国产视频一区在线观看一区免费| 日韩一区欧美二区| 国产探花在线精品| 精品三级国产| 国产一区日韩一区| 少妇精品久久久| 捆绑调教美女网站视频一区| 国产一区2区在线观看| 欧美精品高清| 9久re热视频在线精品| 亚洲tv在线| 国产不卡精品| 亚洲少妇自拍| 国产激情精品一区二区三区| 亚洲成人一区在线观看| 欧美特黄一级| 国产精品久久久久77777丨 | 麻豆视频一区二区| 日韩在线观看不卡| 最新国产精品久久久| 久久精品免视看国产成人| 欧美日韩一二三四| 日本伊人久久| 精品国产鲁一鲁****| 99riav1国产精品视频| 欧美精品影院| 亚洲午夜视频| 久久激情五月婷婷| 神马日本精品| 日韩精品a在线观看91| 中文字幕在线视频久| 免费在线成人网| 久久一区欧美| 日韩在线观看一区二区| 国产不卡精品| 亚洲精品四区| 欧美日韩免费看片| 日韩高清一区| 日韩在线二区| 日韩高清一区二区| 亚洲午夜91| 久久爱www成人| 国产精品毛片| 成人在线视频免费| 日韩在线观看一区二区三区| 精品欧美一区二区三区在线观看| 日韩一区二区三免费高清在线观看 | 久久久精品午夜少妇| 青青草国产成人99久久| 日韩欧美一区二区三区免费看| 婷婷精品在线| 亚洲小说欧美另类婷婷| 麻豆一区二区三| 爽爽淫人综合网网站| 国产理论在线| 国产欧美日韩| 免费在线观看日韩欧美| 国产综合色区在线观看| 国产精品成人国产| 视频一区视频二区中文| 欧美成人精品三级网站| 国产精品igao视频网网址不卡日韩| 亚洲视频播放| 亚洲成人精品| 你懂的国产精品| 亚洲精品福利| 午夜精品一区二区三区国产| 荡女精品导航| 国产精品麻豆成人av电影艾秋 | 免费成人网www| 福利精品一区| 国产福利亚洲| 国产精品网在线观看| 91精品美女| 亚洲精品三级| 水野朝阳av一区二区三区| 99精品国产一区二区三区| 久久中文在线| 国产乱码精品一区二区三区四区| 中文无码久久精品| 亚洲一区二区免费看| 欧美综合另类| 日韩久久视频| 国产精品久久久久久久久妇女| 麻豆国产一区| 国产精品视频3p| 国产探花在线精品| 婷婷综合福利| 日本久久一区| 日韩高清在线观看一区二区| 午夜性色一区二区三区免费视频| 女人天堂亚洲aⅴ在线观看| 999久久久亚洲| 999久久久亚洲| 亚洲午夜一级| 婷婷六月综合| 日韩视频在线一区二区三区 | 日韩精品一级中文字幕精品视频免费观看 | 国产精品久久久久久久免费观看| 国产精品对白| 精品久久一区| 国产一区二区亚洲| 国产美女高潮在线观看| 激情视频网站在线播放色 | 国产精品亲子伦av一区二区三区 | 欧美专区18| 亚洲欧美日韩在线观看a三区| 国产亚洲毛片在线| 中文字幕一区二区三区四区久久| 亚洲免费观看高清完整版在线观| 亚洲麻豆一区| 国产欧美日本| 国产精品免费大片| 国产一区二区三区四区五区| 97精品97| 久久国产成人午夜av影院宅| 香蕉精品视频在线观看| 欧美专区18| 97久久亚洲| 美女国产精品久久久| 精品99在线| 婷婷成人在线| 免费在线观看视频一区| 18国产精品| 九九久久国产| 成人日韩在线观看| 免费日韩视频| 7777精品| 特黄毛片在线观看| 亚洲精品a级片| 中文字幕日本一区二区| 欧美久久一区二区三区| 精品深夜福利视频| 欧美69视频| 日本vs亚洲vs韩国一区三区二区| 国产精品v日韩精品v欧美精品网站 | 人人精品亚洲| 国产精品免费看| 日本国产一区| 久久影院午夜精品| 久久亚洲欧洲| 免费在线观看一区| 国产精品字幕| 亚洲狼人精品一区二区三区| 久久99性xxx老妇胖精品| 日韩欧美中文| 亚洲三级网址| 久久久久久色| 91日韩欧美| 红桃视频国产一区| 日韩国产高清在线| 精品午夜av| 尤物网精品视频| 久久精品99国产精品日本| 日韩高清欧美| 中文字幕中文字幕精品| 精品亚洲二区| 亚洲色诱最新| 久久三级中文| 久久亚洲一区| 超碰在线99| 亚洲欧美在线综合| 麻豆mv在线观看| 亚洲一区欧美| 丁香婷婷久久| 亚洲精品乱码日韩| 一区二区三区四区日本视频| 蜜臀91精品一区二区三区| 国产成人a视频高清在线观看| 免费美女久久99| а√天堂8资源中文在线| 亚洲制服一区| 99热国内精品| 免费一区二区三区在线视频| 免费日韩视频| 日韩高清成人| 麻豆视频一区二区| 日韩一区二区三区四区五区| 99久久99视频只有精品|