MySQL學習筆記(七):存儲引擎


存儲引擎定義了什么?

參考百度百科-存儲引擎

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ù)

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容