【转】2.3【MySQL】运行原理(三)InnoDB 逻辑存储结构
MySQL的存儲(chǔ)結(jié)構(gòu)分為5級(jí):表空間、段、簇、頁(yè)、行。
1.表空間 TableSpace
上篇【MySQL】從InnoDB的內(nèi)存結(jié)構(gòu)、磁盤(pán)結(jié)構(gòu)到update sql執(zhí)行過(guò)程分析?在磁盤(pán)結(jié)構(gòu)部分就說(shuō)過(guò)了,表空間可以看做是InnoDB 存儲(chǔ)引擎邏輯結(jié)構(gòu)的最高層,所有的數(shù)據(jù)都存放在表空間中。分為:系統(tǒng)表空間、獨(dú)占表空間、通用表空間、臨時(shí)表空間、Undo表空間。
2.段 Segment
表空間是由各個(gè)段組成的,常見(jiàn)的段有數(shù)據(jù)段、索引段、回滾段等,段是一個(gè)邏輯的概念。一個(gè)ibd文件(獨(dú)立表空間文件)里面會(huì)由很多個(gè)段組成。
創(chuàng)建一個(gè)索引會(huì)創(chuàng)建兩個(gè)段,一個(gè)是索引段:leaf node segment,一個(gè)是數(shù)據(jù)段:non-leafnodesegment。索引段管理非葉子節(jié)點(diǎn)的數(shù)據(jù)。數(shù)據(jù)段管理葉子節(jié)點(diǎn)的數(shù)據(jù)。也就是說(shuō),一個(gè)表的段數(shù),就是索引的個(gè)數(shù)乘以2。
3.簇 Extent
一個(gè)段(Segment)又由很多的簇(也可以叫區(qū))組成,每個(gè)區(qū)的大小是1MB(64個(gè)連續(xù)的頁(yè))。每一個(gè)段至少會(huì)有一個(gè)簇,一個(gè)段所管理的空間大小是無(wú)限的,可以一直擴(kuò)展下去,但是擴(kuò)展的最小單位就是簇。
4.頁(yè) Page(重點(diǎn))
為了高效管理物理空間,對(duì)簇進(jìn)一步細(xì)分,就得到了頁(yè)。簇是由連續(xù)的頁(yè)(Page)組成的空間,一個(gè)簇中有64個(gè)連續(xù)的頁(yè)。 (1MB/16KB=64)。這些頁(yè)面在物理上和邏輯上都是連續(xù)的。
跟大多數(shù)數(shù)據(jù)庫(kù)一樣,InnoDB也有頁(yè)的概念(也可以稱為塊),每個(gè)頁(yè)默認(rèn)16KB。頁(yè)是InnoDB存儲(chǔ)引擎磁盤(pán)管理的最小單位,通過(guò)innodb_page_size設(shè)置。一個(gè)表空間最多擁有2^32個(gè)頁(yè),默認(rèn)情況下一個(gè)頁(yè)的大小為16KB,也就是說(shuō)一個(gè)
表空間最多存儲(chǔ)64TB的數(shù)據(jù)。
注意,文件系統(tǒng)中,也有頁(yè)的概念。操作系統(tǒng)和內(nèi)存打交道,最小的單位是頁(yè)P(yáng)age。文件系統(tǒng)的內(nèi)存頁(yè)通常是4K。
SHOW VARIABLES LIKE 'innodb_page_size';假設(shè)一行數(shù)據(jù)大小是1K,那么一個(gè)數(shù)據(jù)頁(yè)可以放16行這樣的數(shù)據(jù)。下面的示例就用每頁(yè)放3行數(shù)據(jù):
由于索引屬于二叉查找樹(shù),所以索引字段是有序的。往表中插入數(shù)據(jù)時(shí)
- 如果一個(gè)頁(yè)面已經(jīng)寫(xiě)完,產(chǎn)生一個(gè)新的葉頁(yè)面(如果一個(gè)簇的所有的頁(yè)面都被用完,會(huì)從當(dāng)前頁(yè)面所在段新分配一個(gè)簇)
- 如果數(shù)據(jù)不是連續(xù)的,往已經(jīng)寫(xiě)滿的頁(yè)中插入數(shù)據(jù),會(huì)導(dǎo)致葉頁(yè)面分裂
5.行 Row
InnoDB 存儲(chǔ)引擎是面向行的(row-oriented),也就是說(shuō)數(shù)據(jù)的存放按行進(jìn)行存放。
| Antelope(Innodb-base) | ROW_FORMAT=COMPACT ROW_FORMAT=REDUNDANT | Compact 和 redumdant 的區(qū)別在就是在于首部的存 存內(nèi)容區(qū)別。 compact的存儲(chǔ)格式為首部為一個(gè)非NULL的變長(zhǎng)字段長(zhǎng)度列表 redundant 的存儲(chǔ)格式為首部是一個(gè)字段長(zhǎng)度偏移 列表(每個(gè)字段占用的字節(jié)長(zhǎng)度及其相應(yīng)的位移)。 在 Antelope 中對(duì)于變長(zhǎng)字段,低于 768 字節(jié)的,不 會(huì)進(jìn)行 overflowpage 存儲(chǔ),某些情況下會(huì)減少結(jié)果集 IO. |
| Barracuda(Innodb-plugin) | ROW_FORMAT=DYNAMIC ROW_FORMAT=COMPRESSED | 這兩者主要是功能上的區(qū)別功能上的。 另外在行里的變長(zhǎng)字段和 Antelope 的區(qū)別是只存 20 個(gè)字節(jié), 其它的 overflowpage 存儲(chǔ)。 另外這兩都需要開(kāi)啟 innodb_file_per_table=1 |
innodb_file_format 在配置文件中指定;
show variables like "%innodb_file_format%"; SET GLOBAL innodb_file_format=Barracuda;row_format則在創(chuàng)建數(shù)據(jù)表時(shí)指定
CREATE TABLE tf1 (c1 INT PRIMARY KEY) ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;查看行格式(注:需要在命令行操作):
SHOW TABLE STATUS LIKE 'tf1'\G;總結(jié)
以上是生活随笔為你收集整理的【转】2.3【MySQL】运行原理(三)InnoDB 逻辑存储结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 苹果推出iOS 15.6第三个测试版:i
- 下一篇: 韩国炸鸡价格猛涨 “韩国人灵魂食品”炸酱