MySQL 行溢出數據

MySQL 行溢出數據

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

儲存數據

儲存上限 65535 個字節不只包含自己的數據,還包含一些其餘數據 (storage overhead),以 VERCHAR 類型爲例,共須要 3 部分儲存空間:sql

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

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

行溢出

因爲 MySQL 中以頁爲基本單位來管理儲存空間的,全部的記錄都會被分配到頁中
因爲一個頁通常爲 16KB (16384 個字節),而一個 VERCHAR 最多能夠存儲 65532 個字節,因此會出現一個頁存放不下一條記錄的狀況,形成行溢出
不只是 VERCHAR,BLOB 和 TEXT 也會發生行溢出sed

存儲方式

對於不一樣行格式,有不一樣儲存溢出頁的方式鏈表

Compact & Reduntant

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

Dynamic & Compressed

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

相關文章
相關標籤/搜索