標籤:
在5.5版本之前,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.00 sec)mysql> insert into myisam_char values(‘abcde‘),(‘abcde ‘),(‘ abcde‘),(‘abcde ‘);Query OK, 4 rows affected (0.00 sec)Records: 4 Duplicates: 0 Warnings: 0mysql> select name,length(name) from myisam_char;+---------+--------------+| name | length(name) |+---------+--------------+| abcde | 5 || abcde | 5 || abcde | 7 || abcde | 5 |+---------+--------------+4 rows in set (0.00 sec)
動態表中包含變長欄位,記錄不是固定長度的,這樣儲存的優點是佔用空間相對較少,但是頻繁的更新或刪除記錄會產生片段,需要定期執行optimize table語句或myisamchk -r命令來改善效能,並且出現故障的時候恢複相對比較困難。
壓縮表由 myisampack 工具建立,佔據非常小的磁碟空間。因為每個記錄是被單獨壓縮的,所以只有非常小的訪問開銷。
MySQL學習筆記(2) - MyISAM儲存引擎