每個(gè)MyISAM在磁盤上存儲(chǔ)成三個(gè)文件。第一個(gè)文件的名字以表的名字開始,擴(kuò)展名指出文件類型。.frm文件存儲(chǔ)表定義。數(shù)據(jù)文件的擴(kuò)展名為.MYD (MYData)。索引文件的擴(kuò)展名是.MYI (MYIndex)。
要明確表示你想要用一個(gè)MyISAM表格,請(qǐng)用ENGINE表選項(xiàng)指出來:
CREATE TABLE t (i INT) ENGINE = MYISAM;
注釋:老版本的MySQL使用TYPE而不是ENGINE(例如,TYPE = MYISAM)。MySQL 5.1為向下兼容而支持這個(gè)語法,但TYPE現(xiàn)在被輕視,而ENGINE是首先的用法。
一般地,ENGINE選項(xiàng)是不必要的;除非默認(rèn)已經(jīng)被改變了,MyISAM是默認(rèn)存儲(chǔ)引擎。
如下是MyISAM存儲(chǔ)引擎的一些特征:
? 所有數(shù)據(jù)值先存儲(chǔ)低字節(jié)。這使得數(shù)據(jù)機(jī)和操作系統(tǒng)分離。二進(jìn)制輕便性的唯一要求是機(jī)器使用補(bǔ)碼(如最近20年的機(jī)器有的一樣)和IEEE浮點(diǎn)格式(在主流機(jī)器中也完全是主導(dǎo)的)。唯一不支持二進(jìn)制兼容性的機(jī)器是嵌入式系統(tǒng)。這些系統(tǒng)有時(shí)使用特殊的處理器。
先存儲(chǔ)數(shù)據(jù)低字節(jié)并不嚴(yán)重地影響速度;數(shù)據(jù)行中的字節(jié)一般是未聯(lián)合的,從一個(gè)方向讀未聯(lián)合的字節(jié)并不比從反向讀更占用更多的資源。服務(wù)器上的獲取列值的代碼與其它代碼相比并不顯得時(shí)間緊。
? 大文件(達(dá)63位文件長(zhǎng)度)在支持大文件的文件系統(tǒng)和操作系統(tǒng)上被支持。
? 當(dāng)把刪除和更新及插入混合的時(shí)候,動(dòng)態(tài)尺寸的行更少碎片。這要通過合并相鄰被刪除的塊,以及若下一個(gè)塊被刪除,就擴(kuò)展到下一塊來自動(dòng)完成。
? 每個(gè)MyISAM表最大索引數(shù)是64。 這可以通過重新編譯來改變。每個(gè)索引最大的列數(shù)是16個(gè)。
? 最大的鍵長(zhǎng)度是1000字節(jié)。這也可以通過編譯來改變。對(duì)于鍵長(zhǎng)度超過250字節(jié)的情況,一個(gè)超過1024字節(jié)的的鍵塊被用上。
? BLOB和TEXT列可以被索引。
? NULL值被允許在索引的列中。這個(gè)占每個(gè)鍵的0-1個(gè)字節(jié)。
? 所有數(shù)字鍵值以高字節(jié)為先被存儲(chǔ)以允許一個(gè)更高地索引壓縮。
? 當(dāng)記錄以排好序的順序插入(就像你使用一個(gè)AUTO_INCREMENT列之時(shí)),索引樹被劈開以便高節(jié)點(diǎn)僅包含一個(gè)鍵。這改善了索引樹的空間利用率。
? 每表一個(gè)AUTO_INCREMEN列的內(nèi)部處理。MyISAM為INSERT和UPDATE操作自動(dòng)更新這一列。這使得AUTO_INCREMENT列更快(至少10%)。在序列頂?shù)闹当粍h除之后就不能再利用。(當(dāng)AUTO_INCREMENT列被定義為多列索引的最后一列,可以出現(xiàn)重使用從序列頂部刪除的值的情況)。AUTO_INCREMENT值可用ALTER TABLE或myisamch來重置。
? 如果數(shù)據(jù)文件中間的表沒有自由塊了,在其它線程從表讀的同時(shí),你可以INSERT新行到表中。(這被認(rèn)識(shí)為并發(fā)操作)。自由塊的出現(xiàn)是作為刪除行的結(jié)果,或者是用比當(dāng)前內(nèi)容多的數(shù)據(jù)對(duì)動(dòng)態(tài)長(zhǎng)度行更新的結(jié)果。當(dāng)所有自由塊被用完(填滿),未來的插入又變成并發(fā)。
? 你可以把數(shù)據(jù)文件和索引文件放在不同目錄,用DATA DIRECTORY和INDEX DIRECTORY選項(xiàng)CREATE TABLE以獲得更高的速度。
? 每個(gè)字符列可以又不同的字符集。
? 在MyISAM索引文件里又一個(gè)標(biāo)志,它表明表是否被正確關(guān)閉。如果用--myisam-recover選項(xiàng)啟動(dòng)mysqld,MyISAM表在打開得時(shí)候被自動(dòng)檢查,如果被表被不恰當(dāng)?shù)仃P(guān)閉,就修復(fù)表。
? 如果你用--update-state選項(xiàng)運(yùn)行myisamchk,它標(biāo)注表為已檢查。myisamchk --fast只檢查那些沒有這個(gè)標(biāo)志的表。
? myisamchk --analyze為部分鍵存儲(chǔ)統(tǒng)計(jì)信息,也為整個(gè)鍵存儲(chǔ)統(tǒng)計(jì)信息。
? myisampack可以打包BLOB和VARCHAR列。
MyISAM也支持下列特征:
? 支持true VARCHAR類型;VARCHAR列以存儲(chǔ)在2個(gè)字節(jié)中的長(zhǎng)度來開始。
? 有VARCHAR的表可以有固定或動(dòng)態(tài)記錄長(zhǎng)度。
? VARCHAR和CHAR列可以多達(dá)64KB。
? 一個(gè)被搞亂的已計(jì)算索引對(duì)可對(duì)UNIQUE來使用。這允許你在表內(nèi)任何列的合并上有UNIQUE。(盡管如此,你不能在一個(gè)UNIQUE已計(jì)算索引上搜索)。
MyISAM表的存儲(chǔ)格式
靜態(tài)格式是MyISAM表的默認(rèn)存儲(chǔ)格式。當(dāng)表不包含變量長(zhǎng)度列(VARCHAR, BLOB, 或TEXT)時(shí),使用這個(gè)格式。每一行用固定字節(jié)數(shù)存儲(chǔ)。
MyISAM的三種存儲(chǔ)格式中,靜態(tài)格式就最簡(jiǎn)單也是最安全的(至少對(duì)于崩潰而言)。靜態(tài)格式也是最快的on-disk格式。快速來自于數(shù)據(jù)文件中的行在磁盤上被找到的容易方式:當(dāng)按照索引中的行號(hào)查找一個(gè)行時(shí),用行長(zhǎng)度乘以行號(hào)。同樣,當(dāng)掃描一個(gè)表的時(shí)候,很容易用每個(gè)磁盤讀操作讀一定數(shù)量的記錄。
當(dāng)MySQL服務(wù)器正往一個(gè)固定格式MyISAM文件寫的時(shí)候,如果計(jì)算機(jī)崩潰了,安全是顯然的。在這種情況下,myisamchk可以容易地決定每行從哪里開始到哪里結(jié)束,所以它通常可以收回所有記錄,除了寫了一部分的記錄。注意,基于數(shù)據(jù)行,MyISAM表索引可以一直被重新構(gòu)建。
靜態(tài)格式表的一般特征:
? CHAR列對(duì)列寬度是空間填補(bǔ)的。
? 非常快。
? 容易緩存。
? 崩潰后容易重建,因?yàn)橛涗浳挥诠潭ㄎ恢谩?
? 重新組織是不必要的,除非你刪除巨量的記錄并且希望為操作系統(tǒng)騰出磁盤空間。為此,可使用OPTIMIZE TABLE或者myisamchk -r。
? 通常比動(dòng)態(tài)格式表需要更多的磁盤空間。
動(dòng)態(tài)表特征
如果一個(gè)MyISAM表包含任何可變長(zhǎng)度列(VARCHAR, BLOB或TEXTDynamic),或者如果一個(gè)表被用ROW_FORMAT=DYNAMIC選項(xiàng)來創(chuàng)建,動(dòng)態(tài)存儲(chǔ)格式被使用。
這個(gè)格式更為復(fù)雜一點(diǎn),因?yàn)槊啃杏幸粋€(gè)表明行有多長(zhǎng)的頭。當(dāng)一個(gè)記錄因?yàn)楦碌慕Y(jié)果被變得更長(zhǎng),該記錄也可以在超過一個(gè)位置處結(jié)束。
你可以使用OPTIMIZE TABLE或myisamchk來對(duì)一個(gè)表整理碎片。如果在一個(gè)表中有你頻繁訪問或改變的固定長(zhǎng)度列,表中也有一些可變長(zhǎng)度列,僅為避免碎片而把這些可變長(zhǎng)度列移到其它表可能是一個(gè)好主意。
動(dòng)態(tài)格式表的一般特征:
? 除了長(zhǎng)度少于4的列外,所有的字符串列是動(dòng)態(tài)的。
? 在每個(gè)記錄前面是一個(gè)位圖,該位圖表明哪一列包含空字符串(對(duì)于字符串列)或者0(對(duì)于數(shù)字列)。注意,這并不包括包含NULL值的列。如果一個(gè)字符列在拖曳空間移除后長(zhǎng)度為零,或者一個(gè)數(shù)字列為零值,這都在位圖中標(biāo)注了且列不被保存到磁盤。 非空字符串被存為一個(gè)長(zhǎng)度字節(jié)加字符串的內(nèi)容。
? 通常比固定長(zhǎng)度表需要更少的磁盤空間。
? 每個(gè)記錄僅使用必需大小的空間。盡管如此,如果一個(gè)記錄變大,它就按需要被分開成多片,造成記錄碎片的后果。比如,你用擴(kuò)展行長(zhǎng)度的信息更新一行,該行就變得有碎片。在這種情況下,你可以時(shí)不時(shí)運(yùn)行OPTIMIZE TABLE或myisamchk -r來改善性能。可使用myisamchk -ei來獲取表的統(tǒng)計(jì)數(shù)據(jù)。
? 動(dòng)態(tài)格式表在崩潰后要比靜態(tài)格式表更難重建,因?yàn)橐粋€(gè)記錄可能被分為多個(gè)碎片且鏈接(碎片)可能被丟失。
已壓縮表特征
已壓縮存儲(chǔ)格式是由myisampack工具創(chuàng)建的只讀格式。
所有MySQL分發(fā)版里都默認(rèn)包括myisampack。已壓縮表可以用myisamchk來解壓縮。
已壓縮表有下列特征:
? 已壓縮表占據(jù)非常小的磁盤空間。這最小化了磁盤用量,當(dāng)使用緩慢的磁盤(如CD-ROM)之時(shí),這是很有用的。
? 每個(gè)記錄是被單獨(dú)壓縮的,所以只有非常小的訪問開支。依據(jù)表中最大的記錄,一個(gè)記錄的頭在每個(gè)表中占據(jù)1到3個(gè)字節(jié)。每個(gè)列被不同地壓縮。通常每個(gè)列有一個(gè)不同的Huffman樹。一些壓縮類型如下:
o 后綴空間壓縮。
- 前綴空間壓縮。
- 零值的數(shù)用一個(gè)位來存儲(chǔ)。
- 如果在一個(gè)整型列中的值有一個(gè)小的范圍,列被用最小可能的類型來存儲(chǔ)。比如,一個(gè)BIGINT列(8字節(jié)),如果所有它的值在-128到127范圍內(nèi),它可以被存儲(chǔ)為TINYINT列(1字節(jié))
- 如果一個(gè)列僅有一小組可能的值,列的類型被轉(zhuǎn)化成ENUM。
- 一個(gè)列可以使用先前壓縮類型的任意合并。
? 可以處理固定長(zhǎng)度或動(dòng)態(tài)長(zhǎng)度記錄。
新聞熱點(diǎn)
疑難解答
圖片精選