辛星解讀mysql中的MyISAM引擎

來源:互聯網
上載者:User

標籤:辛星   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引擎

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.