WIKI使用導(dǎo)航
站長百科導(dǎo)航
站長專題
- 網(wǎng)站推廣
- 網(wǎng)站程序
- 網(wǎng)站賺錢
- 虛擬主機(jī)
- cPanel
- 網(wǎng)址導(dǎo)航專題
- 云計(jì)算
- 微博營銷
- 虛擬主機(jī)管理系統(tǒng)
- 開放平臺
- WIKI程序與應(yīng)用
- 美國十大主機(jī)
MyISAM
來自站長百科
MyISAM,是默認(rèn)存儲引擎。它基于更老的ISAM代碼,但有很多有用的擴(kuò)展。(注意MySQL 5.1不支持ISAM)。 每個(gè)MyISAM在磁盤上存儲成三個(gè)文件。第一個(gè)文件的名字以表的名字開始,擴(kuò)展名指出文件類型。.frm文件存儲表定義。數(shù)據(jù)文件的擴(kuò)展名為.MYD (MYData)。
MyISAM的特征[ ]
- MyISAM存儲引擎的一些特征
- 所有數(shù)據(jù)值先存儲低字節(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í)使用特殊的處理器。
- 大文件(達(dá)63位文件長度)在支持大文件的文件系統(tǒng)和操作系統(tǒng)上被支持。
- 當(dāng)把刪除和更新及插入混合的時(shí)候,動態(tài)尺寸的行更少碎片。這要通過合并相鄰被刪除的塊,以及若下一個(gè)塊被刪除,就擴(kuò)展到下一塊來自動完成。
- 每個(gè)MyISAM表最大索引數(shù)是64。 這可以通過重新編譯來改變。每個(gè)索引最大的列數(shù)是16個(gè)。
- 最大的鍵長度是1000字節(jié)。這也可以通過編譯來改變。對于鍵長度超過250字節(jié)的情況,一個(gè)超過1024字節(jié)的的鍵塊被用上。
- BLOB和TEXT列可以被索引。
- NULL值被允許在索引的列中。這個(gè)占每個(gè)鍵的0-1個(gè)字節(jié)。
- 所有數(shù)字鍵值以高字節(jié)為先被存儲以允許一個(gè)更高地索引壓縮。
- 當(dāng)記錄以排好序的順序插入(就像你使用一個(gè)AUTO_INCREMENT列之時(shí)),索引樹被劈開以便高節(jié)點(diǎn)僅包含一個(gè)鍵。這改善了索引樹的空間利用率。
- 每表一個(gè)AUTO_INCREMEN列的內(nèi)部處理。MyISAM為INSERT和UPDATE操作自動更新這一列。這使得AUTO_INCREMENT列更快(至少10%)。在序列頂?shù)闹当粍h除之后就不能再利用。(當(dāng)AUTO_INCREMENT列被定義為多列索引的最后一列,可以出現(xiàn)重使用從序列頂部刪除的值的情況)。AUTO_INCREMENT值可用ALTER TABLE或myisamch來重置。
- 如果數(shù)據(jù)文件中間的表沒有自由塊了,在其它線程從表讀的同時(shí),你可以INSERT新行到表中。(這被認(rèn)識為并發(fā)操作)。自由塊的出現(xiàn)是作為刪除行的結(jié)果,或者是用比當(dāng)前內(nèi)容多的數(shù)據(jù)對動態(tài)長度行更新的結(jié)果。當(dāng)所有自由塊被用完(填滿),未來的插入又變成并發(fā)。
- 你可以把數(shù)據(jù)文件和索引文件放在不同目錄,用DATA DIRECTORY和INDEX DIRECTORY選項(xiàng)CREATE TABLE以獲得更高的速度,
- MyISAM也支持下列特征
- 支持true VARCHAR類型;VARCHAR列以存儲在2個(gè)字節(jié)中的長度來開始。
- 有VARCHAR的表可以有固定或動態(tài)記錄長度。
- VARCHAR和CHAR列可以多達(dá)64KB。
- 一個(gè)被搞亂的已計(jì)算索引對可對UNIQUE來使用。這允許你在表內(nèi)任何列的合并上有UNIQUE。(盡管如此,你不能在一個(gè)UNIQUE已計(jì)算索引上搜索)。
MyISAM靜態(tài)(固定長度)表特征[ ]
- 靜態(tài)格式是MyISAM表的默認(rèn)存儲格式。當(dāng)表不包含變量長度列(VARCHAR, BLOB, 或TEXT)時(shí),使用這個(gè)格式。每一行用固定字節(jié)數(shù)存儲。
- MyISAM的三種存儲格式中,靜態(tài)格式就最簡單也是最安全的(至少對于崩潰而言)。靜態(tài)格式也是最快的on-disk格式??焖賮碜杂跀?shù)據(jù)文件中的行在磁盤上被找到的容易方式:當(dāng)按照索引中的行號查找一個(gè)行時(shí),用行長度乘以行號。同樣,當(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列對列寬度是空間填補(bǔ)的。
- 非??臁?/li>
- 容易緩存。
- 崩潰后容易重建,因?yàn)橛涗浳挥诠潭ㄎ恢谩?/li>
- 重新組織是不必要的,除非你刪除巨量的記錄并且希望為操作系統(tǒng)騰出磁盤空間。為此,可使用OPTIMIZE TABLE或者myisamchk -r。
- 通常比動態(tài)格式表需要更多的磁盤空間。
MyISAM動態(tài)表特征[ ]
- 如果一個(gè)MyISAM表包含任何可變長度列(VARCHAR, BLOB或TEXTDynamic),或者如果一個(gè)表被用ROW_FORMAT=DYNAMIC選項(xiàng)來創(chuàng)建,動態(tài)存儲格式被使用。
- 這個(gè)格式更為復(fù)雜一點(diǎn),因?yàn)槊啃杏幸粋€(gè)表明行有多長的頭。當(dāng)一個(gè)記錄因?yàn)楦碌慕Y(jié)果被變得更長,該記錄也可以在超過一個(gè)位置處結(jié)束。
- 你可以使用OPTIMIZE TABLE或myisamchk來對一個(gè)表整理碎片。如果在一個(gè)表中有你頻繁訪問或改變的固定長度列,表中也有一些可變長度列,僅為避免碎片而把這些可變長度列移到其它表可能是一個(gè)好主意。
- 動態(tài)格式表的一般特征:
- 除了長度少于4的列外,所有的字符串列是動態(tài)的。
- 在每個(gè)記錄前面是一個(gè)位圖,該位圖表明哪一列包含空字符串(對于字符串列)或者0(對于數(shù)字列)。注意,這并不包括包含NULL值的列。如果一個(gè)字符列在拖曳空間移除后長度為零,或者一個(gè)數(shù)字列為零值,這都在位圖中標(biāo)注了且列不被保存到磁盤。 非空字符串被存為一個(gè)長度字節(jié)加字符串的內(nèi)容。
- 通常比固定長度表需要更少的磁盤空間。
- 每個(gè)記錄僅使用必需大小的空間。盡管如此,如果一個(gè)記錄變大,它就按需要被分開成多片,造成記錄碎片的后果。比如,你用擴(kuò)展行長度的信息更新一行,該行就變得有碎片。在這種情況下,你可以時(shí)不時(shí)運(yùn)行OPTIMIZE TABLE或myisamchk -r來改善性能??墒褂胢yisamchk -ei來獲取表的統(tǒng)計(jì)數(shù)據(jù)。
- 動態(tài)格式表在崩潰后要比靜態(tài)格式表更難重建,因?yàn)橐粋€(gè)記錄可能被分為多個(gè)碎片且鏈接(碎片)可能被丟失。
- 動態(tài)尺寸記錄期望的行長度用下列表達(dá)式來計(jì)算:
- 3
- + (number of columns + 7) / 8
- + (number of char columns)
- + (packed size of numeric columns)
- + (length of strings)
- + (number of NULL columns + 7) / 8
MyISAM已壓縮表特征[ ]
- 已壓縮存儲格式是由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è)位來存儲。
- - 如果在一個(gè)整型列中的值有一個(gè)小的范圍,列被用最小可能的類型來存儲。比如,一個(gè)BIGINT列(8字節(jié)),如果所有它的值在-128到127范圍內(nèi),它可以被存儲為TINYINT列(1字節(jié))
- - 如果一個(gè)列僅有一小組可能的值,列的類型被轉(zhuǎn)化成ENUM。
- - 一個(gè)列可以使用先前壓縮類型的任意合并。
- 可以處理固定長度或動態(tài)長度記錄。