MySQL 行溢出數據


MySQL 行溢出數據

MySQL 對一條記錄占用的最大儲存空間是有限制的,除了 BLOB 和 TEXT 類型之外,其他所有列 (不包括隱藏列和記錄頭信息) 占用的字節長度不能超過 65535 個字節,當記錄長度超過限制時,MySQL 會建議使用 TEXT 或 BLOB 類型

儲存數據

儲存上限 65535 個字節不僅包含本身的數據,還包含一些其他數據 (storage overhead),以 VERCHAR 類型為例,共需要 3 部分儲存空間:

  • 真實數據
  • 真實數據占用的字節長度
  • NULL 值標識,NOT NULL 列沒有這部分

當使用 ascii 字符集時:如果 '真實數據占用的字節長度' 占用兩個字節,NULL 值標識占用一個字節,則真實數據最多只能存儲 65532 個字符
當使用 utf8 字符集時:如果 '真實數據占用的字節長度' 占用兩個字節,NULL 值標識占用一個字節,則真實數據最多只能存儲 21844 (65532 / 3) 個字符

行溢出

由於 MySQL 中以頁為基本單位來管理儲存空間的,所有的記錄都會被分配到頁中
由於一個頁一般為 16KB (16384 個字節),而一個 VERCHAR 最多可以存儲 65532 個字節,所以會出現一個頁存放不下一條記錄的情況,造成行溢出
不僅是 VERCHAR,BLOB 和 TEXT 也會發生行溢出

存儲方式

對於不同行格式,有不同儲存溢出頁的方式

Compact & Reduntant

當發生行溢出時,在 Compact 和 Reduntant 中,'記錄的真實數據' 處只會存儲一部分 (768 字節的) 數據,剩下的數據存儲在幾個其他的頁 (溢出頁) 中 (以鏈表的方式連接),在 '記錄的真實數據' 處用 20 個字節存儲這些頁的地址 (包含分散在其他頁面中的數據的占用的字節數)

Dynamic & Compressed

它們不會在 '記錄的真實數據' 處儲存真實數據的前 768 個字節,而是把所有的字節都存儲到其他頁面中,只儲存其他頁面的地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM