存儲引擎定義了什么?
MySQL中的數(shù)據(jù)用各種不同的技術存儲在文件(或者內(nèi)存)中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平并且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。這些不同的技術以及配套的相關功能在MySQL中被稱作存儲引擎(也稱作表類型)。</br>
你可以選擇適用于服務器、數(shù)據(jù)庫和表格的存儲引擎,以便在選擇如何存儲你的信息、如何檢索這些信息以及你需要你的數(shù)據(jù)結合什么性能和功能的時候為你提供最大的靈活性。</br>
選擇如何存儲和檢索你的數(shù)據(jù)的這種靈活性是MySQL為什么如此受歡迎的主要原因。其它數(shù)據(jù)庫系統(tǒng)(包括大多數(shù)商業(yè)選擇)僅支持一種類型的數(shù)據(jù)存儲。遺憾的是,其它類型的數(shù)據(jù)庫解決方案采取的“一個尺碼滿足一切需求”的方式意味著你要么就犧牲一些性能,要么你就用幾個小時甚至幾天的時間詳細調(diào)整你的數(shù)據(jù)庫。使用MySQL,我們僅需要修改我們使用的存儲引擎就可以了。
可以這么來理解:MySQL是數(shù)據(jù)倉庫,那它是怎么存的數(shù)據(jù),采用的什么存儲機制、用的哪種索引等等,這樣就是存儲引擎來決定的。它規(guī)定了一個表的類型,也就是存儲引擎所描述的數(shù)據(jù)單元是表。
有哪些存儲類型?
MySQL在版本5.5以后,默認存儲引擎是InnoDB,之前版本的默認存儲引擎是MyISAM。所以這兩種應該是最為常用的,也是最應該去了解的。
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.18 |
+-----------+
1 row in set
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set
從上面可以看出MySQL對InnoDB的描述:支持事務、行級鎖以及外鍵。這些都是MyISAM不支持的。
再來看官方文檔對InnoDB的特性總結(Key Advantages of InnoDB):
| 屬性 | 屬性值 | 屬性 | 屬性值 | 屬性 | 屬性值 |
|---|---|---|---|---|---|
| 存儲限制 | 64TB | 事務 | Yes | 鎖定粒度 | Row |
| 多版本并發(fā)控制 | Yes | Geospatial數(shù)據(jù)類型支持 | Yes | Geospatial索引支持 | Yes[a] |
| B-tree索引 | Yes | T-tree索引 | No | Hash索引 | No[b] |
| Full-text search索引 | Yes[c] | Clustered索引 | Yes | 數(shù)據(jù)緩存 | Yes |
| 索引緩存 | Yes | 數(shù)據(jù)壓縮 | Yes[d] | 數(shù)據(jù)加密[e] | Yes |
| 集群數(shù)據(jù)庫支持 | No | 主從復制支持[f] | Yes | 外鍵支持 | Yes |
| 備份/時間點恢復[g] | Yes | 查詢緩存支持 | Yes | 數(shù)據(jù)字典的統(tǒng)計信息更新 | Yes |
a.InnoDB 在MySQL 5.7.5及以上版本支持Geospatial索引
b.InnoDB的自適應Hash索引特性的內(nèi)部實現(xiàn)中使用了Hash索引
c.Barracuda 在MySQL 5.6.4及以上版本支持FULLTEXT索引
d.壓縮InnoDB類型的表需要Barracuda文件格式
e.由服務器實現(xiàn)(通過加密函數(shù)). Data-at-rest tablespace encryption is available in MySQL 5.7 and later.
f.由服務器實現(xiàn),而非存儲引擎。
g.由服務器實現(xiàn),而非存儲引擎。
再來看官方對各種引擎的特性總結:
特性 | MyISAM | Memory | InnoDB | Archive | NDB
--|--|--|--|--|--|--
存儲限制 | 256TB | RAM | 64TB | None | 384EB
事務 | No | No | Yes | No | Yes
鎖粒度 | Table | Table | Row | Row | Row
多版本并發(fā)控制| No | No | Yes | No | No
Geospatial數(shù)據(jù)類型支持 | Yes | No | Yes | Yes | Yes
Geospatial 索引支持 | Yes | No | Yes[a] | No | No
B-tree 索引| Yes | Yes | Yes | No | No
T-tree 索引| No | No | No | No | Yes
Hash 索引| No | Yes | No[b] | No | Yes
Full-text search 索引 | Yes | No | Yes[c] | No | No
Clustered 索引| No | No | Yes | No | No
數(shù)據(jù)緩存 | No | N/A | Yes | No | Yes
索引緩存 | Yes | N/A | Yes | No | Yes
數(shù)據(jù)壓縮| Yes[d] | No | Yes[e] | Yes | No
數(shù)據(jù)加密[f] | Yes | Yes | Yes | Yes | Yes
集群數(shù)據(jù)庫支持 | No | No | No | No | Yes
主從復制支持[g] | Yes | Yes | Yes | Yes | Yes
外鍵支持 | No | No | Yes | No | Yes[h]
備份/時間點恢復[i] | Yes | Yes | Yes | Yes | Yes
查詢緩存支持 | Yes | Yes | Yes | Yes | Yes
數(shù)據(jù)字典的統(tǒng)計信息更新 | Yes | Yes | Yes | Yes | Yes
至此,對MySQL的存儲引擎有概念的認識。
文字總結請參考MySQL 常用數(shù)據(jù)存儲引擎區(qū)別。
MyISAM
mysql 5.5.5 之前的默認引擎,支持 B-tree/FullText/R-tree 索引類型。鎖級別為表鎖,表鎖優(yōu)點是開銷小,加鎖快;缺點是鎖粒度大,發(fā)生鎖沖動概率較高,容納并發(fā)能力低,這個引擎適合查詢?yōu)橹鞯臉I(yè)務。此引擎不支持事務,也不支持外鍵。MyISAM強調(diào)了快速讀取操作。它存儲表的行數(shù),于是SELECT COUNT() FROM TABLE時只需要直接讀取已經(jīng)保存好的值而不需要進行全表掃描。</br>
InnoDB
InnoDB 存儲引擎最大的亮點就是支持事務,支持回滾,它支持 Hash/B-tree 索引類型。
鎖級別為行鎖,行鎖優(yōu)點是適用于高并發(fā)的頻繁表修改,高并發(fā)是性能優(yōu)于 MyISAM。缺點是系統(tǒng)消耗較大,索引不僅緩存自身,也緩存數(shù)據(jù),相比 MyISAM 需要更大的內(nèi)存。
InnoDB 中不保存表的具體行數(shù),也就是說,執(zhí)行 select count() from table時,InnoDB 要掃描一遍整個表來計算有多少行。支持事務,支持外鍵
未完待續(xù)