1. 程式人生 > >MySQL儲存引擎 - MyISAM與InnoDB的優劣

MySQL儲存引擎 - MyISAM與InnoDB的優劣

目錄

一、MyISAM 與 InnoDB 的異同

特性對比表格

特點 MyISAM InnoDB
儲存限制 64TB
事務安全 支援
鎖機制 表鎖 行鎖
B樹索引 支援 支援
雜湊索引
全文索引 支援
叢集索引 支援
資料快取 支援
索引快取 支援 支援
資料可壓縮 支援
空間使用
記憶體使用
批量插入速度
支援外來鍵 支援

二、MyISAM的特性

1. 優勢

訪問速度快,適用於不需要做事務、以讀資料和插資料為主的業務

2.儲存方式

  • 表結構:.frm
  • 資料:.MYD
  • 索引:.MYI

預設儲存在同一路徑下,可在建表時通過DATA DIRECTORYINDEX DIRECTORY設定資料和索引的儲存位置(需要絕對路徑)

3.儲存格式

  • 靜態(固定長度表)表
    MyISAM預設儲存格式,所有欄位為非變長欄位,所有記錄長度固定
    優點:儲存快、易快取、易恢復
    缺點:佔用空間大

    (注:靜態表中資料後邊的空格會被去掉)

  • 動態表
    表中包含變長欄位
    優點:佔用空間少
    缺點:故障不易恢復、頻繁的更新和刪除會產生碎片

    需要定期執行OPTIMIZE TABLE語句或myismchk-r命令來改善效能

  • 壓縮表
    由myisampack工具建立,佔用空間非常小,每個記錄單獨壓縮,只有非常小的訪問開支

三、InnoDB的特性

1. 優勢

支援事務、外來鍵約束、行級鎖

2.自增列

自增列必須是索引,如果是聯合索引則必須在第一位

MyISAM的自增列可以位於聯合索引的任一位置,根據前邊的幾列完成自增

3.外來鍵約束

InnoDB是目前唯一支援外來鍵約束的MySQL引擎
在建立外來鍵時,要求父表必須有對應的索引,子表在建立外來鍵的時候也會自動建立對應的索引

在建立索引時可以指定在刪除、更新父表時,對子表進行的操作:

  • RESTRICTNO ACTION:在子表存在記錄時,父表不能更新
  • CASCADE:在父表更新或刪除時,同時更新或刪除子表對應記錄
  • SET NULL:父表更新或刪除時,子表對應記錄被置為NULL

4.儲存方式

  • 共享表空間儲存
    表結構:.frm
    索引+資料:.innodb_data_home_dir和innodb_data_file_path定義的表空間

    為了均衡IO,可以是多個檔案(為了均衡負載)

  • 多表空間儲存
    表結構:.frm
    索引+資料:.ibd

    每個表的資料和索引單獨儲存在.ibd中
    如果是分割槽表,則每個分割槽對應單獨的.ibd檔案,檔名是表名+分割槽名,可以在建立分割槽時指定每個分割槽的資料檔案位置,均衡負載

四、總結

1.MyISAM

  • 預設的MySQL外掛式儲存引擎
  • 適合不需要事務以及以讀和插入為主的業務
  • 在web和資料倉庫中常用

2.InnoDB

  • 支援事務和外來鍵
  • 對事務完整性有要求,在併發條件下要求資料一致性,有更多的更新和刪除操作的業務(行級鎖優勢),適合使用InnoDB
  • 在計費、財務系統常用

五、相關話題

  • MySQL鎖
  • 索引的實現原理及資料結構