【MYSQL】InnoDB行溢位資料說明

ai3707發表於2016-05-06
    首先說下MySQL資料庫的varchar欄位,真的很實用,它可以存放65536位元組的資料,比oracle和sqlserver大多了,但是在使用varchar時也有幾點要注意;

    1、65536只是這麼說,要建表的時候指定一個欄位65536仍然會報錯,因為欄位本身還有其他開銷,實際只能存放65532位元組。
    2、65532位元組並不是每個varchar欄位都可以設定的,他是一個總和,也就是說如果有2個varchar欄位的表,那麼每個varchar欄位只能設定65532/2的值。
    3、建表時要注意編碼格式哦,varchar(65532)代表的是位元組數,如果使用GBK或者UTF-8那就無法建立成功了,因為GBK一個字元佔用2位元組,UTF-8一個字元佔用3位元組
    以上概念比較簡單,大家建個表試驗一下就好,這裡不再做實驗;大家知道,頁(PAGE)innoDB儲存引擎的最小儲存單位,預設大小為16KB,及16384位元組,行資料儲存在頁中;那麼一行資料如果超過了一個頁能夠儲存的大小怎麼辦?比如上面說的varchar(65532),65532位元組該如何儲存?這個時候就會發生行溢位。

行溢位
    InnoDB儲存引擎可以將一條記錄中的某些資料儲存在真正的資料頁面之外,一般為BLOB\LOB這類的大物件列型別。但是也不是絕對,BLOB可以不將資料放在溢位頁面,而且即便是VARCHAR列資料型別,依然有可能被存放為行溢位資料,比如上例

    我們執行:insert into 表名 select repeat('a',65532),就將一行65532位元組的資料插入到表中了,實際上在底層,真正的資料頁只儲存了一小部分資料,之後是偏移量,指向行溢位資料,這時會產生N個未壓縮的二進位制大物件頁 Uncompressed BLOB Page,這些大物件頁中才是完整存放了65532位元組的資料。

    那麼,一行資料為多大時,會發生行溢位呢?我們知道InnoDB儲存引擎表是索引組織的,即B+樹結構,這樣一個頁中至少要保證有2條資料,否則就變成連結串列了,如果只能存放一條資料,那麼InnoDB儲存引擎會自動將它存放在溢位頁中。如果可以在一個頁中至少放入兩行資料,那麼就不會發生行溢位
    
    其實對於BLOB型別的資料,跟varchar也是一個道理,要看實際的大小,當然,使用者既然使用了blob列型別,一般不可能存放長度過小的資料,因此在大多數情況下BLOB的行資料還是會發生行溢位,實際資料儲存在BLOB頁中,資料頁只儲存資料的前768位元組。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29018063/viewspace-2095072/,如需轉載,請註明出處,否則將追究法律責任。

相關文章