Mysql存儲引擎之MyISAM存儲引擎的介紹

myisam 存儲引擎的表在數據庫中,每一個表都被存放為三個以表名命名的物理文件。首先肯定會有任何存儲引擎都不可缺少的存放表結構定義信息的.frm 文件,另外還有.myd和.myi 文件,分別存放了表的數據(.myd)和索引數據(.myi)。每個表都有且僅有這樣三個文件做為 myisam 存儲類型的表的存儲,也就是說不管這個表有多少個索引,都是存放在同一個.myi 文件中。

MyISAM 支持以下三種類型的索引:

1、B-Tree 索引

B-Tree 索引,顧名思義,就是所有的索引節點都按照 balance tree 的數據結構來存儲,所有的索引數據節點都在葉節點。

2、R-Tree 索引

R-Tree 索引的存儲方式和 b-tree 索引有一些區別,主要設計用于為存儲空間和多維數據的字段做索引,所以目前的 MySQL 版本來說,也僅支持 geometry 類型的字段作索引。

3、Full-text 索引

Full-text 索引就是我們長說的全文索引,他的存儲結構也是 b-tree。主要是為了解決在我們需要用 like 查詢的低效問題。

MyISAM 上面三種索引類型中,最經常使用的就是 B-Tree 索引了,偶爾會使用到 Fulltext,但是 R-Tree 索引一般系統中都是很少用到的。另外 MyISAM 的 B-Tree 索引有一個較大的限制,那就是參與一個索引的所有字段的長度之和不能超過 1000 字節。

雖然每一個 MyISAM 的表都是存放在一個相同后綴名的.MYD 文件中,但是每個文件的存放格式實際上可能并不是完全一樣的,因為 MyISAM 的數據存放格式是分為靜態(FIXED)固定長度、動態(DYNAMIC)可變長度以及壓縮(COMPRESSED)這三種格式。當然三種格式中是否壓縮是完全可以任由我們自己選擇的,可以在創建表的時候通過 ROW_FORMAT 來指定{COMPRESSED | DEFAULT},也可以通過 myisampack 工具來進行壓縮,默認是不壓縮的。而在非壓縮的情況下,是靜態還是動態,就和我們表中個字段的定義相關了。只要表中有可變長度類型的字段存在,那么該表就肯定是 DYNAMIC 格式的,如果沒有任何可變長度的字段,則為 FIXED 格式,當然,你也可以通過 alter table 命令,強行將一個帶有 VARCHAR 類型字段的 DYNAMIC 的表轉換為 FIXED,但是所帶來的結果是原 VARCHAR 字段類型會被自動轉換成CHAR 類型。相反如果將 FIXED 轉換為 DYNAMIC,也會將 CHAR 類型字段轉換為 VARCHAR 類型,所以大家手工強行轉換的操作一定要謹慎。

MyISAM 存儲引擎的表是否足夠可靠呢?在 MySQL 用戶參考手冊中列出在遇到如下情況的時候可能會出現表文件損壞:

1、當 mysqld 正在做寫操作的時候被 kill 掉或者其他情況造成異常終止;

2、主機 Crash;

3、磁盤硬件故障;

4、MyISAM 存儲引擎中的 bug?

MyISAM 存儲引擎的某個表文件出錯之后,僅影響到該表,而不會影響到其他表,更不會影響到其他的數據庫。如果我們的出據苦正在運行過程中發現某個 MyISAM 表出現問題了,則可以在線通過 check table 命令來嘗試校驗他,并可以通過 repair table 命令來嘗試修復。在數據庫關閉狀態下,我們也可以通過 myisamchk 工具來對數據庫中某個(或某些) 表進行檢測或者修復。不過強烈建議不到萬不得已不要輕易對表進行修復操作,修復之前盡量做好可能的備份工作,以免帶來不必要的后果。

另外 MyISAM 存儲引擎的表理論上是可以被多個數據庫實例同時使用同時操作的,但是不論是我們都不建議這樣做,而且 MySQL 官方的用戶手冊中也有提到,建議盡量不要在多個mysqld 之間共享 MyISAM 存儲文件。

?以上就是Mysql存儲引擎之MyISAM存儲引擎的介紹的內容,更多相關內容請關注PHP中文網(www.php.cn)!

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享