【MySQL】你要搞清楚存儲引擎之間的差別,喲

目錄

1.概況對比

2.索引對比

2.1 InnoDB

2.1.1 聚集索引

2.2 myIsam

3.事務

4.鎖


1.概況對比

對比各個存儲引擎之間的特性

特性 InnoDB MyIsam Memory Merge NDB
事務
外鍵
鎖粒度 行鎖 表粒度
索引

B+樹

集羣索引

B+樹

全文索引

B+樹

哈希

B+樹

B+樹

哈希

緩存

索引緩存

數據緩存

索引

索引

數據

索引

索引

數據

Time

批量插入效率

Space

內存

磁盤

 

中等

N/A 無

存儲限制 64TB 受內存限制

MySQL引擎

說明

MyISAM

內存中只緩存索引,不緩存數據;
不支持事務;
只支持表級鎖,支持insert操作和select操作併發進行;
適合讀多寫少的應用,如web;
支持全文索引;

InnoDB

索引和數據都可以緩存到內存中;
支持事務;
支持行級鎖,可實現更高的併發度;
支持故障恢復;
支持外鍵約束;
支持4種不同的事務隔離級別;

Memory

所有數據均存在內存中,可提供高速的查詢效率;
一旦重啓數據庫(包括死機),將丟失所有數據;
不支持blob和text類型;
數據大小必須小於內存容量;
其它特性類似於MyISAM;

Merge

將一系列等同的MyISAM表以邏輯方式組合在一起,並作爲1個對象引用它們。
高併發時,會導致適用的文件句柄數劇增;
適用於數據倉儲等環境。

Archive

可將大量的數據壓縮存儲;
不支持索引;
支持insert和select,不支持delete, replace和 update;
支持行級鎖;

Federated

能夠將多個分離的MySQL服務器鏈接起來,從多個物理服務器創建一個邏輯數據庫;
不支持事務;
不支持alter table等直接修改表結構的DDL操作;
不支持prepare語句;
不支持查詢緩存;

Blackhole

不會存儲任何數據,僅記錄日誌;
適用於日誌統計、過濾、同步中間層等;

CSV

將數據以逗號分隔的格式存儲在文本文件中;
不支持索引;

2.索引對比

2.1 InnoDB

可以分爲聚集索引(clustered inex)和輔助索引(secondary index),聚集索引與輔助索引不同的是,聚集葉子節點存放的是行信息,而輔助索引存放的是主鍵ID。所以在通過輔助索引查找行記錄時,先從輔助索引的樹上找到葉子,再用葉子上的主鍵ID在聚集索引的B+樹上查找到行記錄,這也是爲什麼叫二級索引的原因。

2.1.1 聚集索引

表中數據按照主鍵順序存放。而聚集索引(clustered index)就是按照每張表的主鍵構造一棵B+樹,同時葉子節點中存放的即爲整張表的行記錄數據,也將聚集索引的葉子節點稱爲數據頁,數據頁上存放的是完整的每行的記錄,而(內節點)存放的僅僅是鍵值及指向數據頁的偏移量。由於葉節點存放了InnoDB寫的處理效率差一些,並且會佔用更多的磁盤空間以保留數據和索引。

  1. 內節點(索引頁)存放鍵值和頁偏移量
  2. 葉節點(數據頁)存放行記錄(數據)
    1. 頁內的記錄也是通過雙向鏈表進行維護。
    2. 數據頁間通過雙向鏈表鏈接,頁按照主鍵的順序排序;

2.2 myIsam

不同於InnoDB的是數據頁上存放的是行記錄在磁盤上的地址,而不是實際的數據,也就是說如果通過myIsam的主鍵id

3.事務

只有InnoDB引擎支持事務,能夠保證數據的完整性和一致性,這也是爲什麼大多數場景選擇InnoDB引擎的原因。事務會把數據庫從一種一致狀態轉換爲另一種一致狀態。在數據庫提交工作時,可以確保要麼所有修改都已經保存了,要麼所有修改都不保存。主要是通過redo log和undo log實現的。

特性 表現 實現
原子性(atomicity) 要麼都做,要麼都不做

redo log

undo log 用於異常時回滾到之前的記錄

一致性(consistency)

數據庫的完整性約束沒有被破壞

唯一約束、外鍵約束、業務不變式約束等

undo log

一旦事務中有語句破壞約束導致異常 回滾到之前的一致性狀態

隔離性(isolation)

每個事務對其他事務的操作記錄能相互分離

不可見其它併發事務的修改

鎖機制(串行化 隔離級別)

MVCC undo log(讀已提交、可重複讀)

無(讀未提交 )沒有隔離

持久性(durability)

事務一旦提交,其結果就是永久性的。

即使發生宕機等故障,數據庫也能將數據恢復

redo log(刷盤比數據快)

宕機後可以按照重做日誌再執行恢復

4.鎖

鎖機制用於管理對共享資源的併發訪問,InnoDB存儲引擎會在行級別上對錶數據上鎖,其餘大部分僅支持表級,導致併發修改時阻塞等待。

InnoDB支持多粒度(granular)鎖定,允許事務在行級上的鎖和表級上的鎖同時存在。爲了支持在不同粒度上加鎖,InnoDB引入意向鎖(Intention Lock)。意向鎖是將鎖定的對象分爲多個層次,意向鎖意味着事務希望在更細粒度(fine granularity)上進行加鎖,如圖所示。如果需要對頁上的記錄r進行上X鎖,那麼分別需要對數據庫A、表1、頁上意向鎖IX,最後對記錄r上X鎖。

表類型 語義 觸發語句
共享鎖S 讀一行數據 select...in share mode
排他鎖X 刪除或更新 Insert、Delete、Update、select...for update
意向共享鎖IS 預約加S鎖 加S前加
意向排他鎖IX 預約加X鎖 加X前加

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章