軟件測試 | MyISAM是什麼

MyISAM 是 MySQL 的默認存儲引擎。MyISAM 不支持事務、也不支持外鍵,其優勢是訪問的速度快,對事務完整性沒有要求或者以 SELECT、INSERT 為主的應用基本上都可以使用這個引擎來創建表。

每個 MyISAM 在磁盤上存儲成 3 個文件,其文件名都和表名相同,但擴展名分別是:

  • frm(存儲表定義);
  • MYD(MYData,存儲數據);
  • MYI (MYIndex,存儲索引)。

數據文件和索引文件可以放置在不同的目錄,平均分佈 IO,獲得更快的速度。

要指定索引文件和數據文件的路徑,需要在創建表的時候通過 DATA DIRECTORY 和 INDEX DIRECTORY 語句指定,也就是說不同 MyISAM 表的索引文件和數據文件可以放置到不同的路徑下。文件路徑需要是絕對路徑,並且具有訪問權限。

MyISAM 類型的表可能會損壞,原因可能是多種多樣的,損壞後的表可能不能訪問,會提示需要修復或者訪問後返回錯誤的結果。MyISAM 類型的表提供修復的工具,可以用 CHECK TABLE 語句來檢查 MyISAM 表的健康,並用 REPAIR TABLE 語句修復一個損壞的 MyISAM 表。 表損壞可能導致數據庫異常重新啟動,需要盡快修復並盡可能地確認損壞的原因。

MyISAM 的表又支持 3 種不同的存儲格式,分別是:

  • 靜態(固定長度)表;
  • 動態表;
  • 壓縮表。

其中,靜態表是默認的存儲格式。靜態表中的字段都是非變長字段,這樣每個記錄都是固定長度的,這種存儲方式的優點是存儲非常迅速,容易緩存,出現故障容易恢復;缺點是占用的空間通常比動態表多。靜態表的數據在存儲的時候會按照列的寬度定義補足空格,但是在應用訪問的時候並不會得到這些空格,這些空格在返回給應用之前已經去掉。

但是也有些需要特別註意的問題,如果需要保存的內容後面本來就帶有空格,那麼在返回結果的時候也會被去掉,開發人員在編寫程序的時候需要特別註意,因為靜態表是默認的存儲格式,開發人員可能並沒有意識到這一點,從而丟失瞭尾部的空格。以下例子演示瞭插入的記錄包含空格時處理的情況:

mysql> create table Myisam_char (name char(10)) engine=myisam;
Query OK, 0 rows affected (0.04 sec)
mysql> insert into Myisam_char values('abcde'),('abcde '),(' abcde'),(' abcde ');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select name,length(name) from Myisam_char;
+---------+--------------+
| name | length(name) |
+---------+--------------+
| abcde | 5 |
| abcde | 5 |
| abcde | 7 |
| abcde | 7 |
+---------+--------------+
4 rows in set (0.00 sec)

赞(0)