MyISAM
是基於較舊的(且不再可用的)ISAM
儲存引擎,但具有許多有用的擴充功能。
表 18.2 MyISAM 儲存引擎功能
功能 | 支援 |
---|---|
B 樹索引 | 是 |
備份/時間點還原 (實作在伺服器中,而不是在儲存引擎中。) | 是 |
叢集資料庫支援 | 否 |
叢集索引 | 否 |
壓縮資料 | 是 (僅在使用壓縮列格式時才支援壓縮的 MyISAM 資料表。使用壓縮列格式的 MyISAM 資料表是唯讀的。) |
資料快取 | 否 |
加密資料 | 是 (透過加密函式在伺服器中實作。) |
外鍵支援 | 否 |
全文檢索索引 | 是 |
地理空間資料類型支援 | 是 |
地理空間索引支援 | 是 |
雜湊索引 | 否 |
索引快取 | 是 |
鎖定粒度 | 資料表 |
MVCC | 否 |
複寫支援 (實作在伺服器中,而不是在儲存引擎中。) | 是 |
儲存限制 | 256TB |
T 樹索引 | 否 |
交易 | 否 |
更新資料字典的統計資訊 | 是 |
每個 MyISAM
資料表都以兩個檔案的形式儲存在磁碟上。這些檔案的名稱以資料表名稱開頭,並具有副檔名來表示檔案類型。資料檔案具有 .MYD
(MYData
) 副檔名。索引檔案具有 .MYI
(MYIndex
) 副檔名。資料表定義儲存在 MySQL 資料字典中。
若要明確指定您要使用 MyISAM
資料表,請使用 ENGINE
資料表選項來指示。
CREATE TABLE t (i INT) ENGINE = MYISAM;
在 MySQL 8.4 中,通常需要使用 ENGINE
來指定 MyISAM
儲存引擎,因為 InnoDB
是預設引擎。
您可以使用 mysqlcheck 用戶端或 myisamchk 工具來檢查或修復 MyISAM
資料表。您也可以使用 myisampack 來壓縮 MyISAM
資料表,以減少佔用的空間。請參閱章節 6.5.3,「mysqlcheck — 資料表維護程式」、章節 6.6.4,「myisamchk — MyISAM 資料表維護工具」和章節 6.6.6,「myisampack — 產生壓縮的唯讀 MyISAM 資料表」。
在 MySQL 8.4 中,MyISAM
儲存引擎不提供分割支援。在先前版本的 MySQL 中建立的分割 MyISAM
資料表無法在 MySQL 8.4 中使用。如需更多資訊,請參閱章節 26.6.2,「與儲存引擎相關的分割限制」。如需有關升級這些資料表以便在 MySQL 8.4 中使用的幫助,請參閱章節 3.5,「MySQL 8.4 中的變更」。
MyISAM
資料表具有以下特性
所有資料值都以低位元組優先的方式儲存。這使得資料與機器和作業系統無關。二進位可移植性的唯一要求是機器使用二補數有符號整數和 IEEE 浮點格式。這些要求在主流機器中廣泛使用。二進位相容性可能不適用於嵌入式系統,這些系統有時會有特殊的處理器。
以低位元組優先的方式儲存資料沒有顯著的速度損失;資料表列中的位元組通常是不對齊的,並且以相反順序讀取未對齊的位元組僅需少量額外處理。此外,與其他程式碼相比,伺服器中擷取欄位值的程式碼並非時間關鍵。
所有數值索引鍵值都以高位元組優先的方式儲存,以允許更好的索引壓縮。
在支援大型檔案的檔案系統和作業系統上支援大型檔案 (最大到 63 位元的檔案長度)。
一個
MyISAM
資料表中限制為 (232)2 (1.844E+19) 列。每個
MyISAM
資料表的最大索引數為 64。每個索引的最大欄數為 16。
最大索引鍵長度為 1000 個位元組。這也可以透過變更原始碼並重新編譯來變更。對於大於 250 個位元組的索引鍵,將使用大於預設值 1024 個位元組的較大索引鍵區塊大小。
當以排序順序插入列時 (例如當您使用
AUTO_INCREMENT
欄時),索引樹會分割,使高節點僅包含一個索引鍵。這改善了索引樹中的空間利用率。支援每個資料表內部處理一個
AUTO_INCREMENT
欄。MyISAM
會自動更新INSERT
和UPDATE
操作的此欄。這使得AUTO_INCREMENT
欄更快(至少快 10%)。在刪除後,不會重複使用序列頂端的值。(當AUTO_INCREMENT
欄定義為多欄索引的最後一欄時,確實會重複使用從序列頂端刪除的值。)可以使用ALTER TABLE
或 myisamchk 重設AUTO_INCREMENT
值。當混合使用刪除、更新和插入時,動態大小的列的片段化程度要小得多。這是透過自動組合相鄰的已刪除區塊,以及在下一個區塊被刪除時延伸區塊來完成的。
MyISAM
支援並行插入:如果資料表在資料檔的中間沒有可用區塊,您可以在其他執行緒從該資料表讀取資料的同時,使用INSERT
陳述式將新列插入其中。可用區塊可能會因刪除列或更新動態長度的列(內容比目前內容多)而產生。當所有可用區塊都被用完(填滿)時,後續的插入會再次變成並行插入。請參閱 第 10.11.3 節,「並行插入」。您可以將資料檔和索引檔放在不同實體裝置上的不同目錄中,以使用
CREATE TABLE
陳述式的DATA DIRECTORY
和INDEX DIRECTORY
資料表選項來獲得更快的速度。請參閱 第 15.1.20 節,「CREATE TABLE 陳述式」。索引資料行中允許使用
NULL
值。每個鍵需要 0 到 1 個位元組。每個字元資料行都可以有不同的字元集。請參閱 第 12 章,「字元集、校對、Unicode」。
MyISAM
索引檔案中有一個旗標,指出資料表是否已正確關閉。如果使用設定了myisam_recover_options
系統變數來啟動 mysqld,則會在開啟時自動檢查MyISAM
資料表,如果資料表未正確關閉,則會修復資料表。如果您使用
--update-state
選項執行 myisamchk,則會將資料表標記為已檢查。myisamchk --fast 只會檢查沒有這個標記的資料表。myisamchk --analyze 會儲存部分鍵以及完整鍵的統計資訊。
myisampack 可以壓縮
BLOB
和VARCHAR
資料行。
MyISAM
還支援下列功能
其他資源
有一個專門討論
MyISAM
儲存引擎的論壇,網址為 https://forums.mysql.com/list.php?21。