天天看點

mysql 記錄(record)

以下内容來源于《mysql核心:Innodb存儲引擎 卷1》

簡單介紹實體記錄和大記錄。僅為了解mysql 索引基礎 存儲結構這一章節而寫。

mysql的預設存儲引擎為Innodb。Innodb在磁盤上管理的最小機關為page(頁),每個頁中又以行記錄方式儲存。

行(row)和記錄(record)是等價的,記錄就是行,行就是記錄。在關系型資料理論中,又把記錄叫做元組(tuple)。行和元組之間也是等價的,在書中,把行作為實體記錄,元組作為邏輯記錄,衆所周知,計算機以二進制的方式儲存資料,那麼行為二進制資料,而元組則為邏輯上的資料。

實體記錄

實體記錄共有兩部分:

1. extra info:又分為col list 和 record header。

2. 實際儲存行。

col list:倒叙存儲列位址,是否為null,是否包含外部存儲屬性(extern)

record header:記錄頭

  • n_owned:在page目錄槽中采用稀疏法,不是一個記錄對應一個槽,而是一個槽對應一條記錄,而這個記錄的n_owned屬性表示該記錄所擁有的記錄數量。
  • head no:
    1. 表示資料在堆中的序列号,記錄之間通過next record關聯。由此可見record之間是一個單連結清單結構。
    2. record之間在實體上是按照插入時間排序,并不是按照主鍵值連續,這樣可以減少增删的耗費,但在邏輯上按主鍵值連續。
    3. head no 還有實作行鎖功能。

行内容:在record header之後就是實際存儲的内容了。

大資料頁

一個頁的大小為16K,資料行存在頁上,當遇到text、blob這種大文本的時候,很有可能一個字段值就超過16k了。那Innodb又是怎麼做的呢?

原來資料不僅存放在目前頁上,當資料量超過範圍以後就會存儲在溢出頁上。這種列的屬性為extern。

範圍

1. 總位元組數大于1/2 * page_get_free_space_of_empty()(8132 bytes);

2. 列大于REC_MAX_DATA_SIZE(16k)

原文位址:https://blog.csdn.net/d57893269/article/details/53907974