標籤:辛星 mysql myisam 引擎 儲存引擎
很多以前的教科書上都是寫的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.MYIuser.MYI is too small to compressC:\Users\Administrator>myisampack db.MYIdb.MYI is too small to compress
那我們找個稍微大一點的表來做實驗:
C:\Users\Administrator>myisampack help_keyword.MYICompressing help_keyword.MYD: (483 records)- Calculating statistics- Compressing file95.15%Remember to run myisamchk -rq on compressed tables
此時,表的壓縮就完成了,可以看出我們的表中原來存放了483條記錄,而且它還提示我們使用myisamchm來解壓縮。
第四點問題就是鎖定和並發,MyISAM在加鎖的時候會對整張表都加鎖,這也是MyISAM廣為詬病的一點,但是在處理並發上,在讀取資料的時候,所有的表上都可以獲得共用鎖定,也就是每個串連會互不干擾,而在寫資料的時候,會獲得獨佔鎖定,會對整個表進行加鎖,其他的請求包括讀和寫都必須處於等待狀態。
第五點就提到了表的修複,這一點也是MyISAM的方便的地方,它可以使用【check table 表名】來檢測表,還可以使用【repair table 表名】來修複表,當然還可以使用optimize來最佳化表,比如去除資料片段等等。
第六點也是比較重要的一點,那就是,MyISAM是支援全文索引的,但是InnoDB不支援,這也是MyISAM少數的幾個比InnoDB功能還多的功能,但是目前的MyISAM貌似還是不支援中文,不過我們可以使用第三方技術來彌補這一點。
這一次就先寫到這裡吧,期待您的關注。
辛星解讀mysql中的MyISAM引擎