天天看點

mysql兩種存儲引擎詳解

mysql中常見的存儲引擎分為兩種,一種是innodb,一種是myisam,兩者各有千秋,大家可能會問,我們建表的時候應該選擇哪種存儲引擎合适呢?,下面讓我們詳細的介紹下兩種存儲引擎

MyIsam 簡介

MyISAM是MySQL的預設資料庫引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的順序通路方法)所改良。雖然性能極佳,但卻有一個缺點:不支援事務處理(transaction)。

Innodb 簡介

InnoDB,是MySQL的資料庫引擎之一,為MySQL AB釋出binary的标準之一。InnoDB由Innobase Oy公司所開發,2006年五月時由甲骨文公司并購。與傳統的ISAM與MyISAM相比,InnoDB的最大特色就是支援了ACID相容的事務(Transaction)功能,類似于PostgreSQL。目前InnoDB采用雙軌制授權,一是GPL授權,另一是專有軟體授權。

innodb與myisam的差別:

  • 存儲結構
    • MyIsam:每個Myisam類型的表在磁盤存儲上分為三個檔案
      • 以.frm結尾的檔案,用來存儲表定義
      • 以.myd結尾的檔案,用來存儲表中的資料
      • 以.myi結尾的檔案,用來存儲表中的所得
    • Innodb:每個innodb類型的表在磁盤存儲上分為兩個檔案
      • 以.frm結尾的檔案,用來存儲表定義
      • 以.idb結尾的檔案,用來存儲表中資料
  • 存儲空間
    • Myisam:可被壓縮,存儲空間較小,支援三種不同的存儲格式:靜态表,動态表,還有壓縮表,在mysql中有固定的緩沖池(例:show status like ‘key_buffer%’)
    • innodb:相對myisam而言,需要更多的記憶體與存儲空間,在mysql中同樣也有固定的innodb緩沖池(例:show status like ‘innodb%pool%’)
  • 事務支援(!important)
    • myisam:相對而言強調的是性能,對寫入操作等要快于innodb,但是并不支援事務
    • innodb:提供事務支援,外鍵支援等進階資料庫功能,具備事務,復原,和較為強大的崩潰修複能力。
  • 表鎖差異
    • myisam:隻支援表級鎖,使用者在執行DML語句時都會給表自動加鎖,對并發請求相對而言支援的較弱,但也有優點就是不會發生死鎖。
    • innodb:不僅支援表級鎖,還支援行級鎖,相對而言并發性能要好了很多,但是會造成死鎖的發生 ==!。
  • 全文索引
    • myisam:在mysql 4.x 之後支援全文索引。
    • innodb: 在mysql 5.6.x 之後支援全文索引。
  • 表主鍵
    • myisam:允許沒有任何索引和主鍵的表存在,索引中儲存的其實是行的位址
    • innodb: 如果沒有設定主鍵或者非空的唯一索引,存儲引擎會自動生成一個6位元組的主鍵(使用者不可見)。
  • curd操作
    • myisam:如果執行大量的select,delete操作,myisam可能相對更加高效一些
    • innodb:相對而言會差一些,如delete from table 在inndb存儲引擎中,innodb不會重新建立一張表,而是逐行删除,是以要清空含義大量資料的表,建議使用 truncate table 指令
  • 外鍵
    • myisam:不支援
    • innodb:支援

看完上面這些差別,大家對兩種存儲引擎的不同有了一定的認識,相信對今後如何選擇存儲引擎有了一些自己的想法,建議為了資料安全和可維護性,大家在今後的工作中一個資料庫中隻使用一種存儲引擎,當然作者本人更傾向于innodb。

附:

DML操作:資料庫操作語言,詳解:傳送門。

三種不同的存儲格式:詳解:傳送門。

鎖:詳解:傳送門 or 入門介紹

繼續閱讀