天天看點

MyISAM和InnoDB差別關聯詳解

Mysql架構

什麼存儲引擎

MySQL和InnoDB對比1.2

總結

Mysql存儲架構
MyISAM和InnoDB差別關聯詳解

從上圖可以發現,MySQL由以下幾部分組成:

連接配接池元件

管理服務和工具元件

SQL接口元件

查詢分析器元件

優化器元件

緩沖(Cache) 元件

插件式存儲引擎

實體檔案

為什麼會有存儲引擎

    程序實作資料處理時,是不可能直接通路磁盤上的資料的,因為它沒有權限,隻有讓核心來把它所通路的資料加載至記憶體中以後,程序在記憶體中完成修改,由核心再負責把資料存回磁盤 ,整個存取過程,尤其是通路比較熱點的資料,也不可能每一次當使用者通路時或當某SQL語句用到時再臨時從磁盤加載到記憶體中.這樣效率較低

存儲引擎簡單功用

    存儲引擎負責把具體分析的結果完成對磁盤上檔案路徑通路的轉換,資料庫中的行資料都是存儲在磁盤塊上的,是以存儲引擎要把資料庫資料映射為磁盤塊,并把磁盤塊加載至記憶體中,把頻繁通路到的熱點資料,統統裝入記憶體,使用者通路、修改時直接在記憶體中操作,隻不過周期性的寫入磁盤上而已

需要特備注意的是,存儲引擎是基于表的而不是資料庫

MySQL和InnoDB對比1

    mysql是插件式存儲引擎,它就能夠替換使用選擇多種不同的引擎,MyISAM是MySQL 經典的存儲引擎

之一,InnoDB是innobase提供給MySQL的

MyISAM和InnoDB差別關聯詳解

注:

2.僅當使用壓縮行格式時,才支援壓縮MyISAM表。 在MyISAM中使用壓縮行格式的表是隻讀的。

3.通過加密功能在伺服器中實作。

4.通過加密功能在伺服器上實作; 在MySQL 5.7和更高版本中,支援靜态資料表空間加密。

6. MySQL 5.6和更高版本提供了對FULLTEXT索引的InnoDB支援。

7. MySQL 5.7和更高版本提供了InnoDB對地理空間索引的支援。

8. InnoDB在内部将哈希索引用于其自适應哈希索引功能。
           
InnoDB和MyISAM之間的比較2

1、InnoDB通過重放其日志從崩潰或其他意外關閉中恢複。 MyISAM必須完全掃描并修複或重建任何已更新但未完全重新整理到磁盤的索引或可能的表。 由于InnoDB方法大約是固定時間,而MyISAM時間随着資料檔案的大小而增長,是以随着資料庫大小的增長,InnoDB提供了更高的可用性。

2、将innodb_flush_log_at_trx_commit設定為1的InnoDB在每次事務後重新整理事務日志,大大提高了可靠性。MyISAM必須在完全記錄的檔案系統上運作,例如使用data = journal安裝的ext4,以提供與資料檔案損壞相同的彈性。(可以将日志放在SSD裝置上以提高MyISAM性能,類似地,InnoDB日志可以放在非日志檔案系統上,例如在SSD上運作的ext2,以獲得類似的性能提升。在任何一種情況下都不會犧牲可靠性。)

3、InnoDB可以在可靠性較低但在某些情況下具有更高性能的模式下運作。 将innodb_flush_log_at_trx_commit設定為0将切換到在将控制權傳回給調用方之前未将事務送出到磁盤的模式。 相反,磁盤重新整理發生在計時器上。

I4、InnoDB會自動将多個并發I插入組合在一起并同時将它們重新整理到磁盤。MyISAM依賴于檔案系統塊緩存來緩存對資料行和索引的讀取,而InnoDB在引擎本身内執行此操作,将行緩存與索引緩存相結合。

5、如果存在,InnoDB将以主鍵順序存儲行,否則将存儲第一個唯一鍵順序。 如果選擇密鑰以便于常見操作,這可以明顯更快。如果沒有主鍵或唯一密鑰,InnoDB将使用内部生成的唯一整數密鑰,并将以粗略的插入順序實體存儲記錄,如 MyISAM做到了。 或者,可以使用自動增量主鍵字段來實作相同的效果。

6、InnoDB為資料和索引提供可更新的LZW壓縮頁面存儲。 MyISAM壓縮表無法更新。

7、在完全符合ACID标準的模式下運作時,InnoDB必須每次事務至少對磁盤執行一次重新整理,盡管它會将重新整理與多個連接配接的插入結合起來。 對于典型的硬碟驅動器或陣列,這将限制每秒約200次更新事務。 對于需要更高事務率的應用程式,将需要具有寫入緩存和備用電池的磁盤控制器,以保持事務完整性。 InnoDB還提供了幾種減少這種影響的模式,自然會導緻事務完整性保證的丢失,盡管仍然保留了比MyISAM更高的可靠性。 MyISAM沒有這種開銷,隻是因為它不支援事務。

8、MyISAM使用表級鎖定對任何現有行進行更新和删除,并可選擇附加新行而不是鎖定并将其插入可用空間。 InnoDB使用行級鎖定。 對于經常更新許多行的大型資料庫應用程式,行級鎖定至關重要,因為單個表級鎖定會顯着降低資料庫中的并發性。

InnoDB和MyISAM都支援全文搜尋,InnoDB在MySQL 5.6.4中獲得全文索引支援[5],但結果可能會有顯着差異.

總結

MyISAM存儲引擎适用場景

    隻讀(或者寫較少)、表較小(可以接受長時間進行修複操作)

MyISAM引擎檔案

    tbl_name.frm 表格式定義

    tbl_name.MYD 資料檔案

    tbl_name.MYI 索引檔案

InnoDB資料庫檔案

    所有InnoDB表的資料和索引放置于同一個表空間中

    表空間檔案:datadir定義的目錄下

資料檔案:ibddata1, ibddata2, …

    每個表單獨使用一個表空間存儲表的資料和索引

    兩類檔案放在對應每個資料庫獨立目錄中

資料檔案(存儲資料和索引):tb_name.ibd

    表格式定義:tb_name.frm

啟用:innodb_file_per_table=ON (MariaDB 5.5以後版是預設值)

繼續閱讀