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 個字節,而是把所有的字節都存儲到其他頁面中,只儲存其他頁面的地址