【MYSQL】InnoDB行溢位資料說明
首先說下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位元組。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 瞭解 MySQL的資料行、行溢位機制嗎?MySql
- mysql innodb相關引數說明MySql
- 資料庫欄位簡寫說明資料庫
- mysql的text/blob和行溢位MySql
- MySQL資料庫監控項說明MySql資料庫
- 帝國cms所有資料庫欄位說明資料庫
- mysql資料庫誤刪除操作說明MySql資料庫
- 聊聊資料溢位的事
- 【MySQL經典案例分析】關於資料行溢位由淺至深的探討MySql
- 幾個和MySQL InnoDB相關的引數設定說明MySql
- mysql資料庫show的常用命令說明MySql資料庫
- mysql 版本說明MySql
- 用Excel做資料說明――抽樣說明工具Excel
- 資料分頁說明
- 傳說中的記憶體溢位記憶體溢位
- mysql資料庫誤刪除後的資料恢復操作說明MySql資料庫資料恢復
- MySQL 資料庫誤刪除後的資料恢復操作說明MySql資料庫資料恢復
- flink同步MySQL資料的時候出現記憶體溢位MySql記憶體溢位
- 隨筆:MySQL 查詢事務狀態欄位說明MySql
- 如何判斷整數資料的溢位
- 如何在Oracle資料庫中查詢表和欄位說明Oracle資料庫
- mysql innodb_autoinc_lock_mode 的與資料庫行為MySql資料庫
- mysql 變數說明MySql變數
- MySQL引數說明MySql
- 記憶體溢位:native溢位 和 上層溢位記憶體溢位
- mysql innodb的行鎖MySql
- 【ORACLE】物化檢視相關後設資料檢視欄位說明Oracle
- MySQL 數值型別溢位處理MySql型別
- oracle資料塊轉儲說明Oracle
- Standby資料庫常用操作說明資料庫
- 從一條資料說起——InnoDB儲存資料結構資料結構
- mysql字符集說明MySql
- mysql processlist詳細說明MySql
- mysql count函式說明MySql函式
- MySQL大小寫敏感說明MySql
- MySQL的information_schema資料庫表說明及用法舉例MySqlORM資料庫
- MySQL InnoDB表--BTree基本資料結構MySql資料結構
- 阿里大佬講解Java記憶體溢位示例(堆溢位、棧溢位)阿里Java記憶體溢位