很多以前的教科書上都是寫的MyISAM是mysql的默認存儲引擎,其實自從mysql5.5開始,默認存儲引擎就已經改變成為InnoDB了,由於InnoDB在很多方面有著不可替代的功能,因此,很多人喜歡研究InnoDB也在情理之中,我也很喜歡InnoDB。但是呢,對於MyISAM,就跟著辛星辛博士來認識一下吧。
第一點就是MyISAM不支持事務和外鍵,也正是基於這一點,很多人不喜歡MyISAM。但是MyISAM並不著急改變自己,因為這個引擎的重心是性能,而不是功能,不可否認,MyISAM的性能是非常卓越的,尤其在讀數據上面。
第二點就是它的文件格式,一個MyISAM表通常分為三部分,第一部分是xxx.frm,這個文件用於存儲表的定義,我們使用alter table的時候就會修改這個數據,因此使用alter table的速度是比較快的,第二部分是後綴名是myd的文件,其實這裡的d是data的首字母,用於存放MyISAM的數據文件,第三部分是後綴名是myi的文件,這裡的i是index的首字母,用於存放MyISAM的索引文件。默認情況下數據文件和索引文件是放在同一個目錄下的,但是我們也可以放在不同的目錄來獲得更高的速度。
第三點就是MyISAM支持三種不同的存儲格式,它們分別是靜態格式、動態格式和壓縮格式,這裡注意壓縮格式只能使用myisampack工具來創建。先說靜態格式,它也是MyISAM的默認存儲格式,當我們的表中不包含變量長度列比如varchar等數據類型時,它會自動使用這個格式,每一行都會選用固定的字節數存儲。靜態格式的優點就是查找速度非常快,容易緩存,容易修復(我在前面講數據碎片的時候提到過用optimize table來修復表),缺點就是占據的磁盤空間要多一些。然後說動態格式,動態格式較為復雜一些,因為每行都有一個表明行有多長的列。每個記錄僅僅需要必需大小的空間,如果一個記錄變大的話,它就按照需要被分開成為多片,造成記錄碎片。比如當我們用擴展長度的信息更新數據,該行就會產生碎片。因為動態的原因,也就更容易產生碎片,所以我們往往需要多次的優化表。
對於壓縮表,我們應該先建立一個表,然後使用myisampack來壓縮,壓縮之後的表會占用較小的磁盤空間,這樣會最小化磁盤的使用,而且它是每個記錄單獨壓縮的,所以訪問的時候的開銷還是蠻小的,它還會修改相應的我們的數據類型。比如一個列的值在-128到127之間,但是我們使用了int來存儲,那麼它會自動轉化為tinyint來存儲。如果一個列只有一組很小的可能的值,則列的類型被轉化為ENUM。
那麼很多人可能想說我們實例操作一下表的壓縮吧,好的,辛星童鞋絕對滿足大家的要求,我們來實例操作一下,不過必須說明的是,對於太小的表,是不會去壓縮的,比如下面的兩個例子:
C:\Users\Administrator>myisampack user.MYI user.MYI is too small to compress C:\Users\Administrator>myisampack db.MYI db.MYI is too small to compress
那我們找個稍微大一點的表來做實驗:
C:\Users\Administrator>myisampack help_keyword.MYI Compressing help_keyword.MYD: (483 records) - Calculating statistics - Compressing file 95.15% Remember to run myisamchk -rq on compressed tables
此時,表的壓縮就完成了,可以看出我們的表中原來存放了483條記錄,而且它還提示我們使用myisamchm來解壓縮。
第四點問題就是鎖定和並發,MyISAM在加鎖的時候會對整張表都加鎖,這也是MyISAM廣為诟病的一點,但是在處理並發上,在讀取數據的時候,所有的表上都可以獲得共享鎖,也就是每個連接會互不干擾,而在寫數據的時候,會獲得排他鎖,會對整個表進行加鎖,其他的請求包括讀和寫都必須處於等待狀態。
第五點就提到了表的修復,這一點也是MyISAM的方便的地方,它可以使用【check table 表名】來檢測表,還可以使用【repair table 表名】來修復表,當然還可以使用optimize來優化表,比如去除數據碎片等等。
第六點也是比較重要的一點,那就是,MyISAM是支持全文索引的,但是InnoDB不支持,這也是MyISAM少數的幾個比InnoDB功能還多的功能,但是目前的MyISAM貌似還是不支持中文,不過我們可以使用第三方技術來彌補這一點。
這一次就先寫到這裡吧,期待您的關注。