MySQL -- 數(shù)據(jù)頁

前言

最近在學MySQL禁灼,決定記錄一下,能寫多少寫多少轿曙,不定時更新弄捕,加油。

正文

分幾個部分來吧导帝,大致如下:

  • 字符集與比較規(guī)則

  • 行格式與數(shù)據(jù)頁

  • InnoDB索引

  • 訪問方法與連接

  • explain 與 子查詢優(yōu)化

  • redoundo 日志

  • MVCC 與 鎖

本文為第二部分 第二節(jié) 數(shù)據(jù)頁


上回說的單條記錄沒有挑戰(zhàn)守谓,下面開啟多條記錄的處理--數(shù)據(jù)頁

數(shù)據(jù)頁的秘密其實在前面我們說到的記錄頭的幾個屬性里面已經(jīng)說了一點了,比如分組您单、單鏈表斋荞、最小記錄、最大記錄虐秦、B+樹索引平酿、葉子節(jié)點等。

那么悦陋,讓我們繼續(xù)“脫衣服”~


數(shù)據(jù)頁結(jié)構(gòu)

圖片來源網(wǎng)絡(luò)
名稱 中文名 占用空間大小 簡單描述
File Header 文件頭部 38字節(jié) 頁的一些通用信息
Page Header 頁面頭部 56字節(jié) 數(shù)據(jù)頁專有的一些信息
Infimum + Supremum 最小記錄和最大記錄 26字節(jié) 兩個虛擬的行記錄
User Records 用戶記錄 不確定 實際存儲的行記錄內(nèi)容
Free Space 空閑空間 不確定 頁中尚未使用的空間
Page Directory 頁面目錄 不確定 頁中的某些記錄的相對位置
File Trailer 文件尾部 8字節(jié) 校驗頁是否完整

簡單的介紹一下這些屬性中的重要的東西

Infimum + Supremum
  • 這個值位于整個頁面的第三部分
  • 分別是最小記錄和最大記錄蜈彼,屬于MySQL為每個頁添加的虛擬記錄
  • 由五個字節(jié)的記錄頭 和 八個字節(jié)的 值(分別是單詞InfimumSupremum)組成
  • 最小記錄的記錄頭中heap_no為0
  • 最大記錄的記錄頭中heap_no為1
  • 也就是說正式記錄中的heap_no屬性從2開始
  • 最小記錄的record_type 是2
  • 最大記錄的record_type 是3
  • 最小記錄是頁中單鏈表的頭結(jié)點
  • 最大記錄是頁中單鏈表的尾結(jié)點

Page Directory

  • 這個頁目錄里面存的是一個一個的槽(slot)
  • 每個槽指向組內(nèi)最大記錄的地址偏移量(我理解為頁內(nèi)偏移量)
  • 這個數(shù)據(jù)結(jié)構(gòu)是數(shù)組,按主鍵值從小到大排列
  • 這種結(jié)構(gòu)注定了查詢最快的方式是二分法俺驶,時間復(fù)雜度O(lgN)
  • 頁分裂(前面說過) 時會增加一個槽

User RecordsFree Space

  • 完全空閑的頁是沒有 User Records部分的
  • 插入數(shù)據(jù)時幸逆,從Free Space分配空間給User Records,直到Free Space沒有空間或空間不夠分配新的記錄,這時需要申請新的頁

Page Header

名稱 占用空間大小 描述
PAGE_N_DIR_SLOTS 2字節(jié) 在頁目錄中的槽數(shù)量
PAGE_HEAP_TOP 2字節(jié) 還未使用的空間最小地址秉颗,也就是說從該地址之后就是Free Space
PAGE_N_HEAP 2字節(jié) 本頁中的記錄的數(shù)量(包括最小和最大記錄以及標記為刪除的記錄)
PAGE_FREE 2字節(jié) 第一個已經(jīng)標記為刪除的記錄地址(各個已刪除的記錄通過next_record也會組成一個單鏈表痢毒,這個單鏈表中的記錄可以被重新利用)
PAGE_GARBAGE 2字節(jié) 已刪除記錄占用的字節(jié)數(shù)
PAGE_LAST_INSERT 2字節(jié) 最后插入記錄的位置
PAGE_DIRECTION 2字節(jié) 記錄插入的方向
PAGE_N_DIRECTION 2字節(jié) 一個方向連續(xù)插入的記錄數(shù)量
PAGE_N_RECS 2字節(jié) 該頁中記錄的數(shù)量(不包括最小和最大記錄以及被標記為刪除的記錄)
PAGE_MAX_TRX_ID 8字節(jié) 修改當前頁的最大事務(wù)ID,該值僅在二級索引中定義
PAGE_LEVEL 2字節(jié) 當前頁在B+樹中所處的層級
PAGE_INDEX_ID 8字節(jié) 索引ID蚕甥,表示當前頁屬于哪個索引
PAGE_BTR_SEG_LEAF 10字節(jié) B+樹葉子段的頭部信息哪替,僅在B+樹的Root頁定義
PAGE_BTR_SEG_TOP 10字節(jié) B+樹非葉子段的頭部信息,僅在B+樹的Root頁定義

1.PAGE_GARBAGE

  • 在頁面空間不夠時菇怀,會嘗試將所需空間與這個值比較凭舶,如果夠,那么將記錄移到臨時表中爱沟,再重新插回來(記錄逐條新增是不會產(chǎn)生碎片空間的)帅霜,但很明顯,這很耗性能
  1. PAGE_BTR_SEG_LEAFPAGE_BTR_SEG_TOP
  • 后面會說到段的概念呼伸,一個索引會有兩個段身冀,一個葉子節(jié)點段,一個非葉子節(jié)點段括享,這兩個屬性分別代表一個 Segment Header搂根,代表了哪個表空間哪個頁面的哪個INODE Entry (表空間號 + 頁面號 + 偏移量值)

File Header

名稱 占用空間大小 描述
FIL_PAGE_SPACE_OR_CHKSUM 4字節(jié) 頁的校驗和(checksum值)
FIL_PAGE_OFFSET 4字節(jié) 頁號
FIL_PAGE_PREV 4字節(jié) 上一個頁的頁號
FIL_PAGE_NEXT 4字節(jié) 下一個頁的頁號
FIL_PAGE_LSN 8字節(jié) 頁面被最后修改時對應(yīng)的日志序列位置(英文名是:Log Sequence Number)
FIL_PAGE_TYPE 2字節(jié) 該頁的類型
FIL_PAGE_FILE_FLUSH_LSN 8字節(jié) 僅在系統(tǒng)表空間的一個頁中定義,代表文件至少被刷新到了對應(yīng)的LSN值
FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID 4字節(jié) 頁屬于哪個表空間

這個屬性里面的值就說三個:

  • FIL_PAGE_OFFSET
  1. 每個表空間的頁號唯一铃辖,四個字節(jié)足夠用了
  • FIL_PAGE_PREVFIL_PAGE_NEXT
  1. 上一頁和下一頁剩愧,誒喲,這不是雙向鏈表啊娇斩,那所有的頁加起來組成了一個雙向鏈表哇仁卷,好玩吧~
  • FIL_PAGE_TYPE
類型名稱 十六進制 描述
FIL_PAGE_TYPE_ALLOCATED 0x0000 最新分配,還沒使用
FIL_PAGE_UNDO_LOG 0x0002 Undo日志頁
FIL_PAGE_INODE 0x0003 段信息節(jié)點
FIL_PAGE_IBUF_FREE_LIST 0x0004 Insert Buffer空閑列表
FIL_PAGE_IBUF_BITMAP 0x0005 Insert Buffer位圖
FIL_PAGE_TYPE_SYS 0x0006 系統(tǒng)頁
FIL_PAGE_TYPE_TRX_SYS 0x0007 事務(wù)系統(tǒng)數(shù)據(jù)
FIL_PAGE_TYPE_FSP_HDR 0x0008 表空間頭部信息
FIL_PAGE_TYPE_XDES 0x0009 擴展描述頁
FIL_PAGE_TYPE_BLOB 0x000A BLOB頁
FIL_PAGE_INDEX 0x45BF 索引頁犬第,也就是我們所說的數(shù)據(jù)頁

現(xiàn)在只需要看這最后一個索引頁锦积,又稱數(shù)據(jù)頁(跟InnoDB的特性有關(guān))

屬性介紹了一堆,還是不知道怎么查歉嗓,舉個栗子

  • 假設(shè)一條查詢語句定位到了這個頁面
  • 先將條件中的列(加深為col)與值(假設(shè)為x)拎出來丰介,二分法定位在哪個組。
  1. 假設(shè)10個槽遥椿,(0 + 9)/2 = 4, 將第四個槽的條件列的值拿出來跟x比較基矮,如果x大,那就從5~9的槽中繼續(xù)二分找冠场;如果x小, 那就從0~4的槽中繼續(xù)二分;
  2. 直到前后兩個槽相差為1家浇,那記錄就在那個大的槽里面,又每個槽其實存的是組內(nèi)最大記錄碴裙,那前一個槽對應(yīng)記錄的下一個節(jié)點就是目標槽對應(yīng)組中的最小值钢悲,順著單鏈表往后一個一個比就完事了点额,每組最多八條記錄,這速度還是很快的莺琳。

沒明白就多看兩遍~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末还棱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惭等,更是在濱河造成了極大的恐慌珍手,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辞做,死亡現(xiàn)場離奇詭異琳要,居然都是意外死亡,警方通過查閱死者的電腦和手機秤茅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門稚补,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人框喳,你說我怎么就攤上這事课幕。” “怎么了五垮?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵乍惊,是天一觀的道長。 經(jīng)常有香客問我拼余,道長污桦,這世上最難降的妖魔是什么亩歹? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任匙监,我火速辦了婚禮,結(jié)果婚禮上小作,老公的妹妹穿的比我還像新娘亭姥。我一直安慰自己,他們只是感情好顾稀,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布达罗。 她就那樣靜靜地躺著,像睡著了一般静秆。 火紅的嫁衣襯著肌膚如雪粮揉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天抚笔,我揣著相機與錄音扶认,去河邊找鬼。 笑死殊橙,一個胖子當著我的面吹牛辐宾,可吹牛的內(nèi)容都是我干的狱从。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叠纹,長吁一口氣:“原來是場噩夢啊……” “哼季研!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起誉察,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤与涡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后持偏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體递沪,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年综液,在試婚紗的時候發(fā)現(xiàn)自己被綠了款慨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡谬莹,死狀恐怖檩奠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情附帽,我是刑警寧澤埠戳,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站蕉扮,受9級特大地震影響整胃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喳钟,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一屁使、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奔则,春花似錦蛮寂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抽莱,卻和暖如春范抓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背食铐。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工匕垫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人璃岳。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓年缎,卻偏偏與公主長得像悔捶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子单芜,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容