MySQL的InnoDB引擎原來是這樣的
大家都知道,對于面試官來說,沒有辦法能夠很直接的能問到面試者對于SQL的理解,所以就會有很多千奇百怪的問題就出現了,比如 SQL 優化,索引創建原則,索引的最左匹配原則,唯一索引,聯合索引,甚至就開始詢問關于 MySQL 的存儲引擎了。
MYSQL 的存儲引擎
首先我們得先知道存儲引擎是什么,
百度百科是這么解釋的:
MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平并且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。
阿粉不知道最近很火的 ChatGTP 是如何解釋這個存儲引擎的,但是在阿粉看來,他就是 MySQL將數據存儲在文件系統中的存儲方式或者存儲格式
又或者說,存儲引擎就是存儲數據,建立索引,更新查詢數據等技術的實現方式 。存儲引擎是基于表的,而不是基于庫的。所以存儲引擎也可被稱為表類型。
也就是說,在一個數據庫中的多個表可以有不同的存儲引擎,這樣面試官再問的時候,可別說不可以。
既然我們知道了 MYSQL 的存儲引擎是什么了,那么就得來說說他的分類了。
MYSQL 存儲引擎分類:
- InnoDB、
- MyISAM、
- MEMORY、
- CSV、
- BLACKHOLE、
- FEDERATED、
- MRG_MYISAM、
- ARCHIVE、
- PERFORMANCE_SCHEMA。
這么一看的話,MYSQL 的存儲引擎那分類也是很多樣的,這樣阿粉接下來就詳細的拆開,一個一個的說說他的存儲引擎,只講用的比較多的,其他的只做簡單了解就OK了,比較,如果要是你能和面試官就一兩個存儲引擎聊的非常透徹的話,那么相信你也入職也沒啥問題。
InnoDB 存儲引擎
首先第一點,mysql5.6 以上默認存儲方式就是使用的 InnoDB存儲引擎,而 InnoDB 存儲引擎的各方面的優點也是非常多的,例如:
用于事務處理應用程序,支持外鍵和行級鎖。如果應用對事物的完整性有比較高的要求,在并發條件下要求數據的一致性, 數據操作除了插入和查詢之外,還包括很多更新和刪除操作,那么 InnoDB 存儲引擎是比較合適的。
InnoDB 除了有效的降低由刪除和更新導致的鎖定,還可以確保事務的完整提交和回滾, 對于類似計費系統或者財務系統等對數據準確要求性比較高的系統都是合適的選擇。
InnoDB 的行級別鎖定以及 Oracle 風格的一致性無鎖讀提升了它的多用戶并發數以及性能。InnoDB 將用戶數據存儲在聚集索引中以減少基于主鍵的普通查詢所帶來的 I/O 開銷。為了保證數據的完整性,InnoDB 還支持外鍵約束。
我們也是可以通過 SQL 來查詢當前數據庫默認的存儲引擎的,SQL 語句如下:
上述語句是查詢默認使用的存儲引擎,而查詢當前 MYSQL 支持的存儲引擎則是使用下面的語句:
既然我們已經都知道了關于這個 InnoDB 的相關特點了,那么接下來我們還得來看看這個關于 InnoDB 存儲引擎的磁盤結構。
InnoDB磁盤主要包含Tablespaces,InnoDB Data Dictionary,Doublewrite Buffer、Redo Log 和Undo Logs。
Tablespaces:system表空間是InnoDB數據字典、doublewrite緩沖區、change緩沖區和undo日志的存儲區域。如果表是在系統表空間中創建的,而不是在每個表的文件或一般表空間中創建的話,它還可以包含表和索引數據。
InnoDB Data Dictionary:InnoDB數據字典由內部系統表組成,其中包含用于跟蹤表、索引和表列等對象的元數據。元數據物理上位于InnoDB系統表空間中。由于歷史原因,數據字典元數據與InnoDB表元數據文件(.frm文件)中的信息存在一定程度的重疊。
Doublewrite Buffer:doublewrite緩沖區是一個存儲區域,InnoDB在將頁面寫到InnoDB數據文件中的適當位置之前,在這個存儲區域中寫入從緩沖池中刷新的頁面。如果在頁寫過程中出現了操作系統、存儲子系統或意外的mysqld進程退出,InnoDB可以在崩潰恢復期間從doublewrite緩沖區中找到一個好的頁副本。
Redo Log:重做日志是一種基于磁盤的數據結構,在崩潰恢復期間用于糾正不完整事務寫入的數據。在正常操作過程中,重做日志對SQL語句或低級API調用產生的表數據更改請求進行編碼。在意外關閉之前未完成數據文件更新的修改將在初始化期間和接受連接之前自動重播。有關重做日志在崩潰恢復中的角色的信息。
Undo Logs:撤消日志是與單個讀寫事務相關聯的撤消日志記錄的集合。撤銷日志記錄包含關于如何撤銷事務對聚集索引記錄的最新更改的信息。如果另一個事務需要將原始數據作為一致讀操作的一部分來查看,則從撤消日志記錄中檢索未修改的數據。Undo日志存在于Undo日志段中,包含在回滾段中。回滾段位于系統表空間、undo表空間和臨時表空間中。
下面是阿粉找的硬盤結構圖:
關于 InnoDB 引擎,其實我們最主要掌握的就是他的一系列的特點,下面則是他的優點:
它的DML操作遵循ACID(atomicity原子,consistency一致,isolation隔離,durability持久)模型,事務具有提交、回滾和崩潰恢復功能,以保護用戶數據。
并發性能好:行級鎖定和oracle風格的一致讀取可以提高多用戶并發性和性能。
查詢性能好:InnoDB表在磁盤上排列數據,以優化基于主鍵的查詢。每個InnoDB表都有一個主鍵索引,稱為聚集索引,用于組織數據以最小化主鍵查找的I/O。
業務性能好:為了保持數據的完整性,InnoDB支持外鍵約束。使用外鍵,插入、更新和刪除將被檢查,以確保它們不會導致相關表之間的不一致。有些生產環境不使用外鍵,以業務代碼維護表數據間關系。
一般對于 InnoDB 掌握這些差不多也算是能應對面試官的提問了,今天阿粉就先講到這里,之后繼續講解關于 MySQL 的其他的存儲引擎。