日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

在InnoDB存儲(chǔ)引擎的索引里,存在一些數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)的概念,這一節(jié)先了解一下InnodDB的邏輯存儲(chǔ)結(jié)構(gòu),為索引的學(xué)習(xí)打好基礎(chǔ)。

從InnoDB存儲(chǔ)引擎的存儲(chǔ)結(jié)構(gòu)看,所有數(shù)據(jù)都被邏輯地放在一個(gè)空間中,稱之為表空間(tablespace)、區(qū)(extent)、頁(yè)(page)組成,頁(yè)在一些文檔中也被稱之為塊(block)。

1、InnoDB邏輯存儲(chǔ)結(jié)構(gòu)

InnoDB存儲(chǔ)引擎的邏輯存儲(chǔ)結(jié)構(gòu)大致如圖:

MySQL高級(jí)進(jìn)階:關(guān)于InnoDB存儲(chǔ)結(jié)構(gòu),一文深入分析講解

 

這張圖更清晰地展示了這些空間的包含關(guān)系:

MySQL高級(jí)進(jìn)階:關(guān)于InnoDB存儲(chǔ)結(jié)構(gòu),一文深入分析講解

 

1.1、表空間(Tablespace)

表空間可以看做InnoDB邏輯結(jié)構(gòu)的最高層,所有的數(shù)據(jù)都放在表空間中。

在默認(rèn)情況下,InnoDB存儲(chǔ)引擎都有一個(gè)共享表空間ibdata1,即所有數(shù)據(jù)都存放在這個(gè)表空間內(nèi)。如果用戶啟用了參數(shù)innodb_file_per_table,則每張表內(nèi)的數(shù)據(jù)可以單獨(dú)放到一個(gè)表空間內(nèi)。

如果啟用了innodb_file_per_table參數(shù),也需要注意,每張表的表空間存放的只是數(shù)據(jù)、索引和插入緩沖Bitmap頁(yè),其它類的數(shù)據(jù),如回滾(undo)信息,插入緩沖索引頁(yè)、系統(tǒng)事務(wù)信息,二次寫緩沖等還是存放在原來(lái)的共享表空間內(nèi)。

1.2、段(Segment)

表空間是由各個(gè)段組成的,常見(jiàn)的段有數(shù)據(jù)段、索引段、回滾段等。

InnoDB存儲(chǔ)引擎表是索引組織(index organized)的,因此數(shù)據(jù)即索引,索引即數(shù)據(jù)。那么數(shù)據(jù)段即為B+樹的葉子節(jié)點(diǎn)(Leaf node segment),索引段即為B+樹的非索引節(jié)點(diǎn)(Non-leaf node segment),這些內(nèi)容在后面的索引學(xué)習(xí)里會(huì)詳細(xì)介紹。

1.3、區(qū)(extend)

區(qū)是由連續(xù)頁(yè)組成的空間,在任何情況下每個(gè)區(qū)的大小都為1MB。為了保證區(qū)中頁(yè)的連續(xù)性,InonoDB存儲(chǔ)引擎一次從磁盤申請(qǐng)4-5個(gè)區(qū)。在默認(rèn)情況下,InnoDB存儲(chǔ)引擎的頁(yè)的大小為16KB,即一個(gè)區(qū)中應(yīng)有64個(gè)連續(xù)的頁(yè)。

InnoDB1.0.x版本開始引入壓縮頁(yè),每個(gè)頁(yè)的大小可以通過(guò)參數(shù)KEY_BLOCK_SIZE設(shè)置為2K、4K、8K,因此每個(gè)區(qū)對(duì)應(yīng)的頁(yè)尾512、256、128.

InnoDB1.2.x版本新增了參數(shù)innodb_page_size,通過(guò)該參數(shù)可以將默認(rèn)頁(yè)的大小設(shè)置為4K、8K,但是頁(yè)中的數(shù)據(jù)不是壓縮的。

但是有時(shí)候?yàn)榱斯?jié)約磁盤容量的開銷,創(chuàng)建表默認(rèn)大小是96KB,區(qū)中是64個(gè)連續(xù)的頁(yè)。(對(duì)于一些小表)

1.4、頁(yè)(page)

頁(yè)是InnoDB存儲(chǔ)引擎磁盤管理的最小單位,每個(gè)頁(yè)默認(rèn)16KB;InnoDB存儲(chǔ)引擎從1.2.x版本開始,可以通過(guò)參數(shù)innodb_page_size將頁(yè)的大小設(shè)置為4K、8K、16K。

若設(shè)置完成,則所有表中頁(yè)的大小都為innodb_page_size,不可以再次對(duì)其進(jìn)行修改,除非通過(guò)MySQLdump導(dǎo)入和導(dǎo)出操作來(lái)產(chǎn)生新的庫(kù)。

innoDB存儲(chǔ)引擎中,常見(jiàn)的頁(yè)類型有:

  • 數(shù)據(jù)頁(yè)(B-tree Node)
  • undo頁(yè)(undo Log Page)
  • 系統(tǒng)頁(yè) (System Page)
  • 事務(wù)數(shù)據(jù)頁(yè) (Transaction System Page)
  • 插入緩沖位圖頁(yè)(Insert Buffer Bitmap)
  • 插入緩沖空閑列表頁(yè)(Insert Buffer Free List)
  • 未壓縮的二進(jìn)制大對(duì)象頁(yè)(Uncompressed BLOB Page)
  • 壓縮的二進(jìn)制大對(duì)象頁(yè) (compressed BLOB Page)

1.5、行(row)

InnoDB存儲(chǔ)引擎是面向行的(row-oriented),也就是說(shuō)數(shù)據(jù)是按行進(jìn)行存放的,每個(gè)頁(yè)存放的行記錄也是有硬性定義的,最多允許存放16KB/2-200,即7992行記錄。

2、InnoDB 行記錄格式

InnoDB 存儲(chǔ)引擎和大多數(shù)數(shù)據(jù)庫(kù)一樣(如 Oracle 和 Microsoft SQL Server 數(shù)據(jù)庫(kù)),記錄是以行的形式存儲(chǔ)的。這意味著頁(yè)中保存著表中一行行的數(shù)據(jù)。在 InnoDB 1.0x 版本之前,InnoDB 存儲(chǔ)引擎提供了 Compact 和 Redundant 兩種格式來(lái)存放行記錄數(shù)據(jù),這也是目前使用最多的一種格式。

2.1、Compact 行記錄格式

Compact 行記錄是在 MySQL 5.0 中引人的,其設(shè)計(jì)目標(biāo)是髙效地存儲(chǔ)數(shù)據(jù)。簡(jiǎn)單來(lái)說(shuō),一個(gè)頁(yè)中存放的行數(shù)據(jù)越多,其性能就越髙。

下圖顯示了 Compact 行記錄的存儲(chǔ)方式:

MySQL高級(jí)進(jìn)階:關(guān)于InnoDB存儲(chǔ)結(jié)構(gòu),一文深入分析講解

 

Compact 行記錄格式的首部是一個(gè)非 NULL 變長(zhǎng)字段長(zhǎng)度列表,并且其是按照列的順序逆序放置的,其長(zhǎng)度為:

  • 若列的長(zhǎng)度小于 255 字節(jié),用 1 字節(jié)表示;
  • 若大于 255 個(gè)字節(jié),用2 字節(jié)表示。

變長(zhǎng)字段的長(zhǎng)度最大不可以超過(guò) 2 字節(jié),這是因在 MySQL 數(shù)據(jù)庫(kù)中 VARCHAR 類型的最大長(zhǎng)度限制為 65535。變長(zhǎng)字段之后的第二個(gè)部分是 NULL 標(biāo)志位,該位指示了該行數(shù)據(jù)中是否有 NULL 值,有則用 1 表示。

接下來(lái)的部分是記錄頭信息(record header),固定占用5 字節(jié)(40 位)。每位含義見(jiàn)表:

MySQL高級(jí)進(jìn)階:關(guān)于InnoDB存儲(chǔ)結(jié)構(gòu),一文深入分析講解

 

最后的部分就是實(shí)際存儲(chǔ)每個(gè)列的數(shù)據(jù)。

需要特別注意的是,NULL 不占該部分任何空間,即 NULL 除了占有 NULL 標(biāo)志位,實(shí)際存儲(chǔ)不占有任何空間。另外有一點(diǎn)需要注意的是,每行數(shù)據(jù)除了用戶定義的列外,還有兩個(gè)隱藏列,事務(wù) 1D 列和回滾指針列,分別為 6 字節(jié)和 7 字節(jié)的大小。若 InnoDB 表沒(méi)有定義主鍵,每行還會(huì)增加一個(gè) 6 字節(jié)的 rowid 列。

Redundant 是 MySQL 5 . 0 版本之前 InnoDB 的 行 記 錄 存 儲(chǔ) 方 式,這里就不展開。

2.2、行溢出數(shù)據(jù)

InnoDB 存儲(chǔ)引擎可以將一條記錄中的某些數(shù)據(jù)存儲(chǔ)在真正的數(shù)據(jù)頁(yè)之外。因?yàn)橐话銛?shù)據(jù)頁(yè)默認(rèn)大小為16KB,假如一個(gè)數(shù)據(jù)頁(yè)存儲(chǔ)不了插入的數(shù)據(jù),這時(shí)肯定就會(huì)發(fā)生行溢出。

MySQL高級(jí)進(jìn)階:關(guān)于InnoDB存儲(chǔ)結(jié)構(gòu),一文深入分析講解

 

一般認(rèn)為 BLOBLOB 這類的大對(duì)象列類型的存儲(chǔ)會(huì)把數(shù)據(jù)存放在數(shù)據(jù)頁(yè)之外。但是,BLOB 也可以不將數(shù)據(jù)放在溢出頁(yè)面,而且即便是 VARCHAR 列數(shù)據(jù)類型,依然有可能被存放為行溢出數(shù)據(jù)。

3、InnoDB 數(shù)據(jù)頁(yè)結(jié)構(gòu)

頁(yè)是 InnoDB 存儲(chǔ)引擎管理數(shù)據(jù)庫(kù)最小磁盤單位。頁(yè)類型為 B-tree Node 的頁(yè)存放的即是表中行的實(shí)際數(shù)據(jù)了。

InnoDB 數(shù)據(jù)頁(yè)由以下 7 個(gè)部分組成:

  • File Header (文件頭)
  • Page Header (頁(yè)頭)
  • Infimun 和 Supremum Records
  • User Records (用戶記錄,即行記錄)
  • Free Space (空閑空間)
  • Page Directory (頁(yè)目錄)
  • File Trailer (文件結(jié)尾信息)
MySQL高級(jí)進(jìn)階:關(guān)于InnoDB存儲(chǔ)結(jié)構(gòu),一文深入分析講解

 

其中 File HeaderPage HeaderFile Trailer的大小是固定的, 分別為 38、56、8 字節(jié),這些空間用來(lái)標(biāo)記該頁(yè)的一些信息,如 Checksum, 數(shù)據(jù)頁(yè)所在 B+ 樹索引的層數(shù)等。User RecordsFree SpacePage Directory 這些部分為實(shí)際的行記錄存儲(chǔ)空間,因此大小是動(dòng)態(tài)的。

分享到:
標(biāo)簽:InnoDB
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定