成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一條 INSERT 背后的秘密:揭開(kāi) InnoDB 記錄結(jié)構(gòu)的神秘面紗

數(shù)據(jù)庫(kù)
我們?cè)趯?xiě) SQL 的時(shí)候,經(jīng)常只關(guān)注“寫(xiě)對(duì)了沒(méi)”、“跑起來(lái)沒(méi)報(bào)錯(cuò)”。但真正理解 MySQL 的底層行為,往往要從一句簡(jiǎn)單的 INSERT 開(kāi)始。

你以為你寫(xiě)了一條 SQL,其實(shí)你是在和數(shù)據(jù)庫(kù)的一整套存儲(chǔ)機(jī)制打交道。

一、引言:懂記錄結(jié)構(gòu),真的很重要!

開(kāi)篇三連擊:

  • 當(dāng)你敲下INSERT時(shí),數(shù)據(jù)是在磁盤(pán)「蓋房子」還是「搭積木」?
  • 行格式里藏著哪些「加密代碼」?
  • 一條“莫名其妙”的慢查詢(xún),根源可能是行格式選錯(cuò)?

這些問(wèn)題的答案,就藏在 InnoDB 的記錄結(jié)構(gòu)里。

我們?cè)趯?xiě) SQL 的時(shí)候,經(jīng)常只關(guān)注“寫(xiě)對(duì)了沒(méi)”、“跑起來(lái)沒(méi)報(bào)錯(cuò)”。但真正理解 MySQL 的底層行為,往往要從一句簡(jiǎn)單的 INSERT 開(kāi)始。

二、從一條INSERT語(yǔ)句開(kāi)始說(shuō)起

當(dāng)我們執(zhí)行INSERT INTO users (name, age,address) VALUES ('張三', 25,'北京.海淀');這條語(yǔ)句時(shí),數(shù)據(jù)并不會(huì)直接 “一股腦” 地塞進(jìn)磁盤(pán)。InnoDB 會(huì)按照特定的規(guī)則,將數(shù)據(jù) “搭建” 成特定的結(jié)構(gòu),然后再存儲(chǔ)到磁盤(pán)上。

為了更好地理解這個(gè)過(guò)程,我們先來(lái)對(duì)比一下行數(shù)據(jù)以及行結(jié)構(gòu)。

假設(shè)我們有一張users表,包含id、name、age、address四個(gè)字段。

CREATE TABLEusers (
    idINTUNSIGNEDNOTNULL AUTO_INCREMENT COMMENT'主鍵ID',
    nameVARCHAR(100) NOTNULLCOMMENT'用戶(hù)姓名',
    age INTUNSIGNEDCOMMENT'年齡',
    address VARCHAR(255) COMMENT'地址',
    PRIMARY KEY (id)
) ENGINE=InnoDBDEFAULTCHARSET=utf8mb4 COMMENT='用戶(hù)信息表';

當(dāng)我們插入一條數(shù)據(jù)(1, '張三', 25,'北京.海淀')時(shí),從表面上看,我們看到的行數(shù)據(jù)是這樣的:

id

name

age

address

1

張三

25

北京海淀

然而在 InnoDB 中,一條數(shù)據(jù)并非簡(jiǎn)單存儲(chǔ),而是拆分成多個(gè)部分:記錄頭信息保存元數(shù)據(jù),變長(zhǎng)字段列表記錄變長(zhǎng)字段及長(zhǎng)度,NULL 值列表標(biāo)記哪些字段為 NULL。

InnoDB目前支持四種行格式:

  • COMPACT(最常用)
  • REDUNDANT(MySQL 5.0之前)
  • DYNAMIC(MySQL 5.7默認(rèn))
  • COMPRESSED(壓縮格式)

COMPACT 行格式是最常用的“標(biāo)準(zhǔn)模板”,掌握它能幫助你理解 InnoDB 記錄結(jié)構(gòu)的核心。

三、COMPACT 行格式詳細(xì)介紹:數(shù)據(jù)存儲(chǔ)的 “標(biāo)準(zhǔn)模板”

廢話不多說(shuō),直接看圖:

1. 記錄頭信息:數(shù)據(jù)的 “身份證”

記錄頭信息僅占5字節(jié),卻包含記錄類(lèi)型、刪除標(biāo)記、B+樹(shù)位置等關(guān)鍵信息,是記錄的重要標(biāo)識(shí)。

當(dāng)我們執(zhí)行DELETE語(yǔ)句刪除一條記錄時(shí),InnoDB 并不會(huì)立即從磁盤(pán)上刪除這條記錄,而是在記錄頭信息中設(shè)置刪除標(biāo)記,后續(xù)再通過(guò)專(zhuān)門(mén)的機(jī)制進(jìn)行清理。

字段 (Field)

位數(shù) (Bits)

描述 (Description)

預(yù)留位1

1

保留位,目前沒(méi)有用到。

預(yù)留位2

1

保留位,目前沒(méi)有用到。

delete_mask

1

標(biāo)記該記錄是否被刪除,1-是,0-否

min_rec_mask

1

標(biāo)記該記錄是否是B+樹(shù)葉子節(jié)點(diǎn)中最小的記錄,1-是,0-否

record_type

3

標(biāo)記記錄的類(lèi)型。000表示普通記錄,001表示最小值記錄,010表示目錄記錄,011表示最大值記錄。

n_owned

4

表示當(dāng)前記錄擁有的記錄數(shù)

heap_no

13

標(biāo)記當(dāng)前記錄在當(dāng)前頁(yè)面(Page)中的相對(duì)位置(槽號(hào))。

next_record

16

表示下一條記錄的相對(duì)位置

預(yù)留位2

1

保留位,目前沒(méi)有用到。

2. 變長(zhǎng)字段列表:應(yīng)對(duì) “變化多端” 的數(shù)據(jù)

在實(shí)際應(yīng)用中,很多字段的數(shù)據(jù)長(zhǎng)度是不固定的,比如VARCHAR、TEXT、BLOB等類(lèi)型的字段。變長(zhǎng)字段列表就是為了應(yīng)對(duì)這些 “變化多端” 的數(shù)據(jù)而設(shè)計(jì)的。它會(huì)記錄哪些字段是變長(zhǎng)的,以及它們的長(zhǎng)度。

變長(zhǎng)字段列表采用倒排的方式存儲(chǔ),也就是說(shuō),它從右往左存儲(chǔ)每個(gè)變長(zhǎng)字段的長(zhǎng)度。

(1) 變長(zhǎng)字段列表如何存儲(chǔ)實(shí)際數(shù)據(jù)?

當(dāng)執(zhí)行插入語(yǔ)句INSERT INTO users VALUES(1, '張三', 25, '北京.海淀');時(shí),我們來(lái)分析一下變長(zhǎng)字段列表的存儲(chǔ)方式。

① 字段分析

  • id:INT 類(lèi)型,固定長(zhǎng)度 4 字節(jié),不屬于變長(zhǎng)字段
  • name:VARCHAR (100),實(shí)際存儲(chǔ) ' 張三 ',UTF-8 編碼下每個(gè)漢字占 3 字節(jié),共 6 字節(jié)
  • age:INT 類(lèi)型,固定長(zhǎng)度 4 字節(jié),不屬于變長(zhǎng)字段
  • address:VARCHAR (255),實(shí)際存儲(chǔ) ' 北京.海淀 ',共包含 5 個(gè)字符(2 個(gè)漢字、1 個(gè)點(diǎn)、2 個(gè)漢字),每個(gè)漢字 3 字節(jié),點(diǎn) 1 字節(jié),共 13 字節(jié)

② 變長(zhǎng)字段列表的倒排存儲(chǔ)

上面的例子中,有兩個(gè)變長(zhǎng)字段:name和address。它們的長(zhǎng)度分別是 6 字節(jié)和 13 字節(jié)。根據(jù)倒排存儲(chǔ)規(guī)則,變長(zhǎng)字段列表會(huì)按照從右到左的順序記錄這些長(zhǎng)度。

  • 表定義順序是:name, address
  • 倒排后,存的時(shí)候順序是:address, name

因此,變長(zhǎng)字段列表的內(nèi)容為:[13,6]。

這些值并不是直接以十進(jìn)制存入,而是編碼成 1~2 字節(jié)的二進(jìn)制形式(依字段長(zhǎng)度大小決定)。

3. NULL 值列表:節(jié)省空間的 “小能手”

在 InnoDB 中,NULL 值列表是一種節(jié)省空間的巧妙設(shè)計(jì)。它不存儲(chǔ) NULL 的實(shí)際值,而是用每個(gè)字段對(duì)應(yīng)的一位二進(jìn)制位來(lái)標(biāo)記:

  • 1 表示該字段為 NULL;
  • 0 表示不為 NULL。

在計(jì)算 InnoDB 記錄結(jié)構(gòu)中的 NULL 值列表時(shí),只有那些“允許為 NULL”的字段才會(huì)被納入統(tǒng)計(jì)。

以 users 表為例:

  • id 是主鍵,不能為 NULL;
  • name 被 NOT NULL 明確聲明,也不能為 NULL;
  • age 和 address 沒(méi)有限定 NOT NULL,默認(rèn)是可以為 NULL 的。

所以,NULL 值列表中只包含 age 和 address 這兩個(gè)字段的狀態(tài)位。

NULL 值列表的位順序,是按照表結(jié)構(gòu)中允許 NULL 字段的出現(xiàn)順序排列的,且僅包含這些字段。

四、行溢出:當(dāng)數(shù)據(jù)太大時(shí)會(huì)發(fā)生什么?

1. 為什么會(huì)出現(xiàn)行溢出?

InnoDB 的數(shù)據(jù)存儲(chǔ)以 “頁(yè)” 為基本單位,每頁(yè)默認(rèn)大小為 16KB。當(dāng)我們插入的數(shù)據(jù)(如一篇幾萬(wàn)字的文章、高清圖片的二進(jìn)制數(shù)據(jù))長(zhǎng)度超過(guò)一頁(yè)能容納的空間時(shí),InnoDB 就會(huì)遇到 “空間不夠用” 的難題。就像你想把 100 本書(shū)塞進(jìn)只能裝 50 本書(shū)的箱子,自然裝不下。

2. 什么是行溢出?

為了解決上述問(wèn)題,InnoDB 引入了行溢出機(jī)制:

  • 當(dāng)數(shù)據(jù)過(guò)長(zhǎng)時(shí),它會(huì)把超出數(shù)據(jù)頁(yè)容量的部分 “搬” 到額外的溢出頁(yè)中存儲(chǔ);
  • 并在原數(shù)據(jù)頁(yè)保留一個(gè)指向溢出頁(yè)的指針(通常是20字節(jié))。

這就好比把裝不下的書(shū)先放在旁邊的臨時(shí)箱子,再在原本的箱子貼上標(biāo)簽注明 “其余書(shū)在隔壁箱”。

行溢出雖解決大字段存儲(chǔ),但帶來(lái)性能隱患,如查詢(xún)慢、空間管理復(fù)雜、碎片增多。優(yōu)化可從多方面入手:拆大字段表、選適配數(shù)據(jù)類(lèi)型與行格式,控制字段長(zhǎng)度,同時(shí)避免在大字段建索引,以此提升數(shù)據(jù)庫(kù)性能。

五、結(jié)語(yǔ):深入底層,才能掌控全局

數(shù)據(jù)庫(kù)的 “高性能密碼” 藏在底層結(jié)構(gòu)里。從 INSERT 語(yǔ)句到磁盤(pán)存儲(chǔ),COMPACT 行格式的字段管理、行溢出的優(yōu)化邏輯,都是提升數(shù)據(jù)庫(kù)能力的關(guān)鍵。懂記錄結(jié)構(gòu),才能在面試中從容應(yīng)答,在優(yōu)化時(shí)直擊痛點(diǎn)。

記住:深挖底層原理,才能讓技術(shù)成長(zhǎng) “知其所以然”。歡迎留言交流,一起解鎖更多數(shù)據(jù)庫(kù)奧秘!

責(zé)任編輯:趙寧寧 來(lái)源: 程序員徐述
相關(guān)推薦

2025-06-04 08:20:30

2015-08-20 13:43:17

NFV網(wǎng)絡(luò)功能虛擬化

2010-05-17 09:13:35

2021-06-07 08:18:12

云計(jì)算云端阿里云

2014-03-12 11:11:39

Storage vMo虛擬機(jī)

2010-05-26 19:12:41

SVN沖突

2009-09-15 15:34:33

Google Fast

2016-04-06 09:27:10

runtime解密學(xué)習(xí)

2023-11-02 09:55:40

2009-06-01 09:04:44

Google WaveWeb

2018-03-01 09:33:05

軟件定義存儲(chǔ)

2017-10-16 05:56:00

2021-08-11 09:01:48

智能指針Box

2011-08-02 08:59:53

2021-07-28 21:49:01

JVM對(duì)象內(nèi)存

2021-09-17 15:54:41

深度學(xué)習(xí)機(jī)器學(xué)習(xí)人工智能

2021-05-25 09:01:21

Linux命令Bash histor

2010-06-17 10:53:25

桌面虛擬化

2020-04-14 10:44:01

區(qū)塊鏈滲透測(cè)試比特幣

2024-02-14 09:00:00

機(jī)器學(xué)習(xí)索引ChatGPT
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美v免费 | 亚洲精选久久 | 91正在播放 | 国产成人精品免高潮在线观看 | 久久爱一区 | japanhdxxxx裸体 | 亚洲一区| 免费国产一区二区视频 | 成人性视频在线播放 | 欧美激情第一区 | 亚洲第一成人av | 国产精品久久久久永久免费观看 | 九色视频网 | 国产黄色在线 | 精品久久久久久久久亚洲 | 亚洲高清视频一区二区 | 国产色片在线 | 九九热精品视频 | 国产精品国产三级国产aⅴ中文 | av天天干 | 在线观看免费观看在线91 | 国产精品看片 | 国产毛片久久久 | 国产69精品久久99不卡免费版 | 一区二区在线免费观看 | 中文字幕在线精品 | 欧美三级视频 | 国产一区三区视频 | 亚洲精品一区二区在线 | 四季久久免费一区二区三区四区 | 色婷婷精品国产一区二区三区 | 精品久久久久久亚洲精品 | 日韩视频一区二区在线 | 午夜免费观看网站 | 日韩av一区二区在线观看 | 亚洲av毛片 | 成人av资源在线 | 免费同性女女aaa免费网站 | 东方伊人免费在线观看 | 一级高清| 欧美精品综合在线 |