【Mysql 學習】MyISAM儲存引擎(一)。

楊奇龍發表於2011-01-05

MyISAM是預設儲存引擎。
每個MyISAM在磁碟上儲存成三個檔案。
第一個檔案的名字以表的名字開始,副檔名指出檔案型別。.frm檔案儲存表定義。
資料檔案的副檔名為.MYD (MYData)。
索引檔案的副檔名是.MYI (MYIndex)。

想要用一個MyISAM表格,可以使用如下語句:
CREATE TABLE t (i INT) ENGINE = MYISAM;
一般地,ENGINE選項是不必要的;除非預設已經被改變了,MyISAM是預設儲存引擎。

如下是MyISAM儲存引擎的一些特徵:
·所有資料值先儲存低位元組。這使得資料機和作業系統分離。二進位制輕便性的唯一要求是機器使用補碼和IEEE浮點格式。
   先儲存資料低位元組並不嚴重地影響速度;資料行中的位元組一般是未聯合的,從一個方向讀未聯合的位元組並不比從反向讀更佔用更多的資源。伺服器上的獲取列值的程式碼與其它程式碼相比並不顯得時間緊。
·大檔案(達63位檔案長度)在支援大檔案的檔案系統和作業系統上被支援。
·當把刪除和更新及插入混合的時候,動態尺寸的行更少碎片。這要透過合併相鄰被刪除的塊,以及若下一個塊被刪除,就擴充套件到下一塊來自動完成。
·每個MyISAM表最大索引數是64。 這可以透過重新編譯來改變。每個索引最大的列數是16個。
·最大的鍵長度是1000位元組。這也可以透過編譯來改變。對於鍵長度超過250位元組的情況,一個超過1024位元組的的鍵塊被用上。
·BLOB和TEXT列可以被索引。
·NULL值被允許在索引的列中。這個佔每個鍵的0-1個位元組。
·所有數字鍵值以高位元組為先被儲存以允許一個更高地索引壓縮。
·當記錄以排好序的順序插入(就像你使用一個AUTO_INCREMENT列之時),索引樹被劈開以便高節點僅包含一個鍵。這改善了索引樹的空間利用率。
·每表一個AUTO_INCREMEN列的內部處理。MyISAM為INSERT和UPDATE操作自動更新這一列。這使得AUTO_INCREMENT列更快(至少10%)。在序列頂的值被刪除之後就不能再利用。(當AUTO_INCREMENT列被定義為多列索引的最後一列,可以出現重使用從序列頂部刪除的值的情況)。AUTO_INCREMENT值可用ALTER TABLE或myisamch來重置。
·如果資料檔案中間的表沒有自由塊了,在其它執行緒從表讀的同時,你可以INSERT新行到表中。(這被認識為併發操作)。自由塊的出現是作為刪除行的結果,或者是用比當前內容多的資料對動態長度行更新的結果。當所有自由塊被用完(填滿),未來的插入又變成併發。
·你可以把資料檔案和索引檔案放在不同目錄,用DATA DIRECTORY和INDEX DIRECTORY選項CREATE TABLE以獲得更高的速度。
·每個字元列可以又不同的字符集。
·在MyISAM索引檔案裡又一個標誌,它表明表是否被正確關閉。如果用--myisam-recover選項啟動mysqld,MyISAM表在開啟得時候被自動檢查,如果被表被不恰當地關閉,就修復表。
·如果你用--update-state選項執行myisamchk,它標註表為已檢查。myisamchk --fast只檢查那些沒有這個標誌的表。
·myisamchk --analyze為部分鍵儲存統計資訊,也為整個鍵儲存統計資訊。
·myisampack可以打包BLOB和VARCHAR列。

MyISAM也支援下列特徵:
·支援true VARCHAR型別;VARCHAR列以儲存在2個位元組中的長度來開始。
·有VARCHAR的表可以有固定或動態記錄長度。
·VARCHAR和CHAR列可以多達64KB。
· 一個被搞亂的已計算索引對可對UNIQUE來使用。這允許你在表內任何列的合併上有UNIQUE。(儘管如此,你不能在一個UNIQUE已計算索引上搜尋)。
 MyISAM啟動選項
下列對mysqld 的選項可用來改變MyISAM表的行為:
·--myisam-recover=mode
設定為崩潰MyISAM表自動恢復的模式。
·--delay-key-write=ALL
對任何MyISAM表的寫操作之間不要重新整理鍵緩衝區。
註釋:如果你要這麼做。當表在使用中之時,你應該不使用來自另一個程式的MyISAM表(比如從另一個MySQL伺服器或用myisamchk)。這麼做會導致索引被破壞。
對使用--delay-key-write的表,使用--external-locking沒有幫助。

下列系統變數影響MyISAM表的行為:
·bulk_insert_buffer_size
用在塊插入最佳化中的樹緩衝區的大小。註釋:這是一個per thread的限制。
·(OBSOLETE) myisam_max_extra_sort_file_size
這個引數已經不在MySQL中使用。
·myisam_max_sort_file_size
如果臨時檔案會變得超過索引,不要使用快速排序索引方法來建立一個索引。註釋:這個引數以位元組的形式給出。
·myisam_sort_buffer_size
設定恢復表之時使用的緩衝區的尺寸。
如果用--myisam-recover選項啟動mysqld,自動恢復被啟用。在這種情況下,當伺服器開啟一個MyISAM表之時,伺服器會檢查表是否被標註為崩潰,或者表的開啟計數變數是否不為0且你正用--skip-external-locking執行伺服器。如果這些條件的任何一個為真,下列情況發生:
·表被查錯。
·如果伺服器發現一個錯誤,它試著做快速表修復(排序且不重新建立資料檔案)。
·如果修復因為資料檔案中的一個錯誤而失敗(例如,一個重複鍵錯誤),伺服器會再次嘗試修復,這一次重建資料檔案。
·如果修復仍然失敗,伺服器用舊修復選項方法再重試一次修復(一行接一行地寫,不排序)。這個方法應該能修復任何型別的錯誤,並且需要很低的磁碟空間。
如果恢復不能夠從先前完成的語句裡恢復所有行,而且你不能在--myisam-recover選項值指定FORCE,自動修復會終止,並在錯誤日誌裡寫一條錯誤資訊:
Error: Couldn't repair table: test.g00pages
如果你指定FORCE,取而代之地,類似這樣的一個警告被給出:
Warning: Found 344 of 354 rows when repairing ./test/g00pages
註釋:如果自動恢復值包括BACKUP,恢復程式建立檔案並用tbl_name-datetime.BAK形式取名。你應該有一個cron指令碼,它自動把這些檔案從資料庫目錄移到備份媒質上。
鍵所需的空間
 MyISAM表使用B型樹索引。你可以粗略地計算索引檔案的大小為(key_length+4)/0.67, 加上所有的鍵之和。當所有鍵以排序的順序插入並且表沒有任何壓縮的鍵之時,以上估計是對最壞的情況的。
   字串索引是被空間壓縮的。如果第一個字串索引部分是字串,它也被加字首壓縮。如果字串列有許多拖曳空間,或字串列是一個總是不用完全長度的VARCHAR列,空間壓縮使得索引檔案比最壞情況時的數值要小。字首壓縮被用在以字串開始的鍵上。如果有許多具有同一字首的字串,字首壓縮是有幫助的。
在MyISAM表,你也可以在建立表的時候透過指定PACK_KEYS=1來字首壓縮數字。當數字被以高位元組優先儲存之時,若你有許多具有同一字首的整數鍵,上述方法是有幫助的。

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

相關文章