mysql的text/blob和行溢位

myownstars發表於2015-02-04

blob儲存二進位制,text儲存文字,前者可當做大個的varbinary,而後者可看成升級版的varchar(與long varchar等價);

兩者都有4種子型別:tiny,normal(預設),medium和long,區別就在可儲存的資料長度不一樣;

而int更是有5個子型別:tiny(1位元組),small(2位元組),medium(3位元組),normal(預設,4位元組),big(8位元組);

注:timestamp4位元組,datatime8位元組,date和time3位元組;enum佔用1-2個位元組(最大儲存65535個欄位);


限制

1 建立索引時必須指定字首;

2 不能指定default value;

3 使用臨時表時必須為磁碟表,memory引擎不支援這兩種欄位;

4 只有前max_sort_length(預設1024)位元組可參與排序;



行溢位

innodb採用B+樹結構,每個資料頁至少要儲存兩個記錄(否則變成了連結串列),如果不能滿足這個需求,則會出現行溢位,innodb只保留欄位前20位元組

(pre-plugin保留768位元組),剩餘資料分配新的資料頁uncompress blob page;

行溢位只與記錄長度有關係,即便行包含blob或text,若一個資料頁可儲存兩條記錄,也不會出現行溢位;

具體可參看《MySQL技術內幕-InnoDB儲存引擎的》的4.4章節 innodb行記錄格式;


對於pre-plugin,行溢位時保留每個欄位的前768位元組,如果保留的位元組總數仍然超出資料頁的一半大小,就會直接報錯1030- Got error 139 from storage engine。譬如一個表建立11個text或varachar(1000)欄位且行記錄長度>8k,則會產生行溢位,保留在原資料頁的記錄長度=11*768>8k,此時不能再繼續行溢位了,因此只能報錯。

具體看參考


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

相關文章