最近用phpmyadmin,突然發現有個引數row_format,以下是手冊中的解答部分,看了之後水平又提公升了,做個記錄。另外看了這部分之後發現原來mysql儲存變長資料的方法和檔案系統原來一樣啊,都是資料和索引分離,然後一堆碎片和鏈結,哈哈。
紅色標出的部分比較重要,很少有人會去關注,提醒大家看下。
15.1.3. myisam表的儲存格式
myisam支援三種不同儲存格式。其中兩個(固定格式和動態格式)根據正使用的列的型別來自動選擇。第三個,即已壓縮格式,只能使用myisampack工具來建立。
當你create或alter乙個沒有blob或text列的表,你可以用row_format表選項強制表的格式為fixed或dynamic。這會導致char和varchar列因fixed格式變成char,或因dynamic格式變成varchar。
通過用alter table指定row_format=,你可以壓縮或解壓縮表,請參閱13.1.5節,「create table語法」。
15.1.3.1. 靜態(固定長度)表特徵
靜態格式是myisam表的預設儲存格式。當表不包含變數長度列(varchar, blob, 或text)時,使用這個格式。每一行用固定位元組數儲存。
myisam的三種儲存格式中,靜態格式就最簡單也是最安全的(至少對於崩潰而言)。靜態格式也是最快的on-disk格式。快速來自於資料檔案中的行在磁碟上被找到的容易方式:當按照索引中的行號查詢乙個行時,用行長度乘以行號。同樣,當掃瞄乙個表的時候,很容易用每個磁碟讀操作讀一定數量的記錄。
當mysql伺服器正往乙個固定格式myisam檔案寫的時候,如果計算機崩潰了,安全是顯然的。在這種情況下,myisamchk可以容易地決定每行從**開始到**結束,所以它通常可以收回所有記錄,除了寫了一部分的記錄。注意,基於資料行,myisam表索引可以一直被重新構建。
靜態格式表的一般特徵:
· char列對列寬度是空間填補的。
· 非常快。
· 容易快取。
· 崩潰後容易重建,因為記錄位於固定位置。
· 重新組織是不必要的,除非你刪除巨量的記錄並且希望為作業系統騰出磁碟空間。為此,可使用optimize table或者myisamchk -r。
· 通常比動態格式表需要更多的磁碟空間。
15.1.3.2. 動態表特徵
如果乙個myisam表包含任何可變長度列(varchar, blob或textdynamic),或者如果乙個表被用row_format=dynamic選項來建立,動態儲存格式被使用。
這個格式更為複雜一點,因為每行有乙個表明行有多長的頭。當乙個記錄因為更新的結果被變得更長,該記錄也可以在超過乙個位置處結束。
你可以使用optimize table或myisamchk來對乙個表整理碎片。如果在乙個表中有你頻繁訪問或改變的固定長度列,表中也有一些可變長度列,僅為避免碎片而把這些可變長度列移到其它表可能是乙個好主意。
動態格式表的一般特徵:
· 除了長度少於4的列外,所有的字串列是動態的。
· 在每個記錄前面是乙個位圖,該位圖表明哪一列包含空字串(對於字串列)或者0(對於數字列)。注意,這並不包括包含null值的列。如果乙個字元列在拖曳空間移除後長度為零,或者乙個數字列為零值,這都在位圖中標註了且列不被儲存到磁碟。 非空字串被存為乙個長度位元組加字串的內容。
· 通常比固定長度表需要更少的磁碟空間。
· 每個記錄僅使用必需大小的空間。儘管如此,如果乙個記錄變大,它就按需要被分開成多片,造成記錄碎片的後果。比如,你用擴充套件行長度的資訊更新一行,該行就變得有碎片。在這種情況下,你可以時不時執行optimize table或myisamchk -r來改善效能。可使用myisamchk -ei來獲取表的統計資料。
· 動態格式表在崩潰後要比靜態格式表更難重建,因為乙個記錄可能被分為多個碎片且鏈結(碎片)可能被丟失。
· 動態尺寸記錄期望的行長度用下列表示式來計算:
· 3
· + (number of columns + 7) / 8
· + (number of char columns)
· + (packed size of numeric columns)
· + (length of strings)
· + (number of null columns + 7) / 8
對每個鏈結需要額外的6位元組。在乙個更新導致乙個記錄的擴大之時,乙個動態記錄被鏈結了。每個新鏈結至少是20位元組,所以下乙個擴大可能在同樣的鏈結裡進行。如果不是,則另乙個鏈結將被建立。你可以使用myisamchk -ed來找出鏈結的數目。所有的鏈結可以用myisamchk -r來移除。
15.1.3.3. 已壓縮表特徵
已壓縮儲存格式是由myisampack工具建立的唯讀格式。
所有mysql分發版裡都預設包括myisampack。已壓縮表可以用myisamchk來解壓縮。
已壓縮表有下列特徵:
· 已壓縮表佔據非常小的磁碟空間。這最小化了磁碟用量,當使用緩慢的磁碟(如cd-rom)之時,這是很有用的。
· 每個記錄是被單獨壓縮的,所以只有非常小的訪問開支。依據表中最大的記錄,乙個記錄的頭在每個表中佔據1到3個位元組。每個列被不同地壓縮。通常每個列有乙個不同的huffman樹。一些壓縮型別如下:
o 字尾空間壓縮。
- 字首空間壓縮。
- 零值的數用乙個位來儲存。
- 如果在乙個整型列中的值有乙個小的範圍,列被用最小可能的型別來儲存。比如,乙個bigint列(8位元組),如果所有它的值在-128到127範圍內,它可以被儲存為tinyint列(1位元組)
- 如果乙個列僅有一小組可能的值,列的型別被轉化成enum。
- 乙個列可以使用先前壓縮型別的任意合併。
· 可以處理固定長度或動態長度記錄。
mysql行格式 MySQL 行格式
以 mysql 預設的儲存引擎 innodb 為例 innodb 包含以下四種行格式 compact redundant dynamic compressed 指定行格式 create table 表名 列的資訊 row format 行格式名稱 alter table 表名 row format ...
mysql 行格式 分割槽方式
innodb邏輯儲存結構 所有資料被邏輯地存放在表空間中,表空間又由段 區 頁 有些文件稱之為塊 行組成。段 常見的段有資料段 回滾段 索引段 與約束這種邏輯概念不同,索引是一種資料結構,不止有邏輯上的概念,在資料庫中還代表著物理儲存的方式。索引段即b 樹的非索引節點 等。innodb由自身完成對段...
MYSQL行格式分析介紹
新建資料庫表的時候有乙個行格式的選項,compact compressed fixed dynamic 這些選項分別在什麼時候使用呢?compact行格式 innodb預設行格式 結構如下 變長字段長度列表,null標誌位,記錄頭資訊,列1資料,列2資料。這個格式當初的設計是為了能高效存放資料,同時...