內(nèi)容介紹
本節(jié)會(huì)分享MySQL 體系結(jié)構(gòu)與存儲(chǔ)引擎,包括 MySQL 數(shù)據(jù)庫(kù)的體系結(jié)構(gòu)、MySQL 支持的存儲(chǔ)引擎,InnoDB 能夠取代 MyISAM 的原因和 InnoDB 幾大核心特性、 MySQL 5.7 版本和 MySQL 8.0 版本做了哪些優(yōu)化和改進(jìn)。
MySQL 數(shù)據(jù)庫(kù)的體系結(jié)構(gòu)
MySQL 數(shù)據(jù)庫(kù)的體系結(jié)構(gòu),如下圖所示

MySQL 體系結(jié)構(gòu)由 Client Connectors 層、MySQL Server 層及存儲(chǔ)引擎層組成。
- Client Connectors 層
負(fù)責(zé)處理客戶端的連接請(qǐng)求,與客戶端創(chuàng)建連接。目前 MySQL 幾乎支持所有的連接類型,例如常見(jiàn)的 JDBC。 - MySQL Server 層
主要包括 Connection Pool、Service & utilities、SQL interface、Parser解析器、Optimizer 查詢優(yōu)化器、Caches 緩存等模塊。
1、Connection Pool,負(fù)責(zé)處理和存儲(chǔ)數(shù)據(jù)庫(kù)與客戶端創(chuàng)建的連接,一個(gè)線程負(fù)責(zé)管理一個(gè)連接。
2、Service & utilities 是管理服務(wù)&工具集,包括備份恢復(fù)、安全管理、集群管理服務(wù)和工具。
3、SQL interface,負(fù)責(zé)接收客戶端發(fā)送的各種 SQL 語(yǔ)句,比如 DML、DDL 和存儲(chǔ)過(guò)程等。Parser 解析器會(huì)對(duì) SQL 語(yǔ)句進(jìn)行語(yǔ)法解析生成解析樹。
4、Optimizer 查詢優(yōu)化器會(huì)根據(jù)解析樹生成執(zhí)行計(jì)劃,并選擇合適的索引,然后按照?qǐng)?zhí)行計(jì)劃執(zhí)行 SQL 語(yǔ)言并與各個(gè)存儲(chǔ)引擎交互。
5、Caches 緩存包括各個(gè)存儲(chǔ)引擎的緩存部分,比如:InnoDB 存儲(chǔ)的 Buffer Pool、MyISAM 存儲(chǔ)引擎的 key buffer 等,Caches 中也會(huì)緩存一些權(quán)限,也包括一些 Session 級(jí)別的緩存。 - 存儲(chǔ)引擎層 包括 MyISAM、InnoDB,以及支持歸檔的 Archive 和內(nèi)存的 Memory 等。MySQL是插件式的存儲(chǔ)引擎,只要正確定義與 MySQL Server 交互的接口,任何引擎都可以訪問(wèn)MySQL,這也是 MySQL 流行的原因之一。存儲(chǔ)引擎底部是物理存儲(chǔ)層,是文件的物理存儲(chǔ)層,包括二進(jìn)制日志、數(shù)據(jù)文件、錯(cuò)誤日志、慢查詢?nèi)罩?、全日志、redo/undo 日志等。
用一條 SQL SELECT 語(yǔ)句的執(zhí)行軌跡來(lái)說(shuō)明客戶端與 MySQL 的交互過(guò)程,如下圖所示。

1、通過(guò)客戶端/服務(wù)器通信協(xié)議與 MySQL 建立連接。
2、查詢緩存,這是 MySQL 的一個(gè)可優(yōu)化查詢的地方,如果開啟了 Query Cache 且在查詢緩存過(guò)程中查詢到完全相同的 SQL 語(yǔ)句,則將查詢結(jié)果直接返回給客戶端;如果沒(méi)有開啟Query Cache 或者沒(méi)有查詢到完全相同的 SQL 語(yǔ)句則會(huì)由解析器進(jìn)行語(yǔ)法語(yǔ)義解析,并生成解析樹。
3、預(yù)處理器生成新的解析樹。
4、查詢優(yōu)化器生成執(zhí)行計(jì)劃。
5、查詢執(zhí)行引擎執(zhí)行 SQL 語(yǔ)句,此時(shí)查詢執(zhí)行引擎會(huì)根據(jù) SQL 語(yǔ)句中表的存儲(chǔ)引擎類型,以及對(duì)應(yīng)的 API 接口與底層存儲(chǔ)引擎緩存或者物理文件的交互情況,得到查詢結(jié)果,由MySQL Server 過(guò)濾后將查詢結(jié)果緩存并返回給客戶端。若開啟了 Query Cache,這時(shí)也會(huì)將SQL 語(yǔ)句和結(jié)果完整地保存到 Query Cache 中,以后若有相同的 SQL 語(yǔ)句執(zhí)行則直接返回結(jié)果。
存儲(chǔ)引擎概述
存儲(chǔ)引擎是 MySQL 中具體與文件打交道的子系統(tǒng),它是根據(jù) MySQL AB 公司提供的文件訪問(wèn)層抽象接口定制的一種文件訪問(wèn)機(jī)制,這種機(jī)制就叫作存儲(chǔ)引擎,常用的存儲(chǔ)引擎MyISAM、支持事務(wù)的 InnoDB、內(nèi)存類型的 Memory、歸檔類型的 Archive、列式存儲(chǔ)的 Infobright等。
在 MySQL 5.6 版本之前,默認(rèn)的存儲(chǔ)引擎都是 MyISAM,但 5.6 版本以后默認(rèn)的存儲(chǔ)引擎就是 InnoDB 了。
InnoDB 存儲(chǔ)引擎的具體架構(gòu)主要有是實(shí)例層(計(jì)算層),位于內(nèi)
位于內(nèi)存中,和是物理層,位于文件系統(tǒng)中。
新版本特性
這里主要講解一下 MySQL 5.7 版本和 8.0 版本的一些新特點(diǎn)。
- MySQL 5.7 版本新特性如下:
1、將 Undo 從共享表空間 ibdata 文件中分離出來(lái),可以在安裝 2、MySQL 時(shí)由用戶自行指定文件大小和數(shù)量。
增加了 temporary 臨時(shí)表空間,里面存儲(chǔ)著臨時(shí)表或臨時(shí)查詢結(jié)果集的數(shù)據(jù)。
3、Buffer Pool 大小可以動(dòng)態(tài)修改,無(wú)需重啟數(shù)據(jù)庫(kù)實(shí)例,這是 DBA 的福音。 - MySQL 8.0 版本新特性如下:
1、將 InnoDB 表的數(shù)據(jù)字典和 Undo 都從共享表空間 ibdata 中徹底分離出來(lái)了,以前需要ibdata 文件中數(shù)據(jù)字典與獨(dú)立表空間 ibd 文件中數(shù)據(jù)字典一致才行,8.0 版本就不需要了。
2、temporary 臨時(shí)表空間也可以配置多個(gè)物理文件,而且均為 InnoDB 存儲(chǔ)引擎并能創(chuàng)建索引,這樣加快了處理的速度。
3、用戶可以像 Oracle 數(shù)據(jù)庫(kù)那樣設(shè)置一些表空間,每個(gè)表空間對(duì)應(yīng)多個(gè)物理文件,每個(gè)表空間可以給多個(gè)表使用,但一個(gè)表只能存儲(chǔ)在一個(gè)表空間中。
InnoDB 和 MyISAM
這里對(duì)比幾個(gè)主流的存儲(chǔ)引擎,如下圖所示。從圖中可以詳細(xì)看到 InnoDB 和 MyISAM 的對(duì)比。
InnoDB 和 MyISAM
- 功能對(duì)比
InnoDB 和 MyISAM 的功能對(duì)比如下圖所示。

1、InnoDB 支持 ACID 的事務(wù) 4 個(gè)特性,而 MyISAM 不支持;
2、InnoDB 支持 4 種事務(wù)隔離級(jí)別,默認(rèn)是可重復(fù)讀 Repeatable Read 的,MyISAM 不支持;
3、InnoDB 支持 crash 安全恢復(fù),MyISAM 不支持;
4、InnoDB 支持外鍵,MyISAM 不支持;
5、InnoDB 支持行級(jí)別的鎖粒度,MyISAM 不支持,只支持表級(jí)別的鎖粒度;
6、InnoDB 支持 MVCC,MyISAM 不支持;
InnoDB 表最大還可以支持 64TB,支持聚簇索引、支持壓縮數(shù)據(jù)存儲(chǔ),支持?jǐn)?shù)據(jù)加密,支持查詢/索引/數(shù)據(jù)高速緩存,支持自適應(yīng)hash索引、空間索引,支持熱備份和恢復(fù)等。
-
性能對(duì)比
在性能對(duì)比上,InnoDB 也完勝 MyISAM,如下圖所示。
4.png
1、讀寫混合模式下,隨著 CPU 核數(shù)的增加,InnoDB 的讀寫能力呈線性增長(zhǎng),
2、在測(cè)試用例里,最高可達(dá)近 9000 的 TPS,但 MyISAM 因?yàn)樽x寫不能并發(fā),它的處理能力跟核數(shù)沒(méi)關(guān)系,呈一條水平線,TPS 低于 500。
3、只讀模式下,隨著 CPU 核數(shù)的增加,InnoDB 的讀寫能力呈線性增長(zhǎng),最高可達(dá)近 14000 的 TPS,但 MyISAM 的處理能力不到 3000 TPS。
InnoDB 存儲(chǔ)引擎
- 核心特性
InnoDB 存儲(chǔ)引擎的核心特性包括:MVCC、鎖、鎖算法和分類、事務(wù)、表空間和數(shù)據(jù)頁(yè)、內(nèi)存線程以及狀態(tài)查詢。
- ARIES 三原則
ARIES 三原則,是指 Write Ahead Logging(WAL)。
1、先寫日志后寫磁盤,日志成功寫入后事務(wù)就不會(huì)丟失,后續(xù)由 checkpoint 機(jī)制來(lái)保證磁盤物理文件與 Redo 日志達(dá)到一致性;
2、利用 Redo 記錄變更后的數(shù)據(jù),即 Redo 記錄事務(wù)數(shù)據(jù)變更后的值;
3、利用 Undo 記錄變更前的數(shù)據(jù),即 Undo 記錄事務(wù)數(shù)據(jù)變更前的值,用于回滾和其他事務(wù)多版本讀。
show engine innodb status\G 的結(jié)果里面有詳細(xì)的 InnoDB 運(yùn)行態(tài)信息,分段記錄的,包括內(nèi)存、線程、信號(hào)、鎖、事務(wù)等,請(qǐng)你多多使用,出現(xiàn)問(wèn)題時(shí)從中能分析出具體原因和解決方案。
總結(jié)回顧

