目錄
1.概況對比
對比各個存儲引擎之間的特性
特性 | InnoDB | MyIsam | Memory | Merge | NDB |
---|---|---|---|---|---|
事務 | √ | ✕ | ✕ | ✕ | ✕ |
外鍵 | √ | ✕ | ✕ | ✕ | ✕ |
鎖粒度 | 行鎖 | 表粒度 | 表 | 表 | 行 |
索引 |
B+樹 集羣索引 |
B+樹 全文索引 |
B+樹 哈希 |
B+樹 |
B+樹 哈希 |
緩存 |
索引緩存 數據緩存 |
索引 |
索引 數據 |
索引 |
索引 數據 |
Time 批量插入效率 |
低 | 高 | 高 | 高 | 高 |
Space 內存 磁盤 |
高 高 |
低 低 |
中等 N/A 無 |
低 低 |
高 低 |
存儲限制 | 64TB | 無 | 受內存限制 | 無 | 無 |
MySQL引擎 |
說明 |
MyISAM |
內存中只緩存索引,不緩存數據; |
InnoDB |
索引和數據都可以緩存到內存中; |
Memory |
所有數據均存在內存中,可提供高速的查詢效率; |
Merge |
將一系列等同的MyISAM表以邏輯方式組合在一起,並作爲1個對象引用它們。 |
Archive |
可將大量的數據壓縮存儲; |
Federated |
能夠將多個分離的MySQL服務器鏈接起來,從多個物理服務器創建一個邏輯數據庫; |
Blackhole |
不會存儲任何數據,僅記錄日誌; |
CSV |
將數據以逗號分隔的格式存儲在文本文件中; |
2.索引對比
2.1 InnoDB
可以分爲聚集索引(clustered inex)和輔助索引(secondary index),聚集索引與輔助索引不同的是,聚集葉子節點存放的是行信息,而輔助索引存放的是主鍵ID。所以在通過輔助索引查找行記錄時,先從輔助索引的樹上找到葉子,再用葉子上的主鍵ID在聚集索引的B+樹上查找到行記錄,這也是爲什麼叫二級索引的原因。
2.1.1 聚集索引
表中數據按照主鍵順序存放。而聚集索引(clustered index)就是按照每張表的主鍵構造一棵B+樹,同時葉子節點中存放的即爲整張表的行記錄數據,也將聚集索引的葉子節點稱爲數據頁,數據頁上存放的是完整的每行的記錄,而(內節點)存放的僅僅是鍵值及指向數據頁的偏移量。由於葉節點存放了InnoDB寫的處理效率差一些,並且會佔用更多的磁盤空間以保留數據和索引。
- 內節點(索引頁)存放鍵值和頁偏移量
- 葉節點(數據頁)存放行記錄(數據)
- 頁內的記錄也是通過雙向鏈表進行維護。
- 數據頁間通過雙向鏈表鏈接,頁按照主鍵的順序排序;
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前加 |