MySQL 儲存引擎知識點
- 2021 年 4 月 27 日
- 筆記
'''
MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。
例如,如果你在研究大量的臨時數據,你也許需要使用內存存儲引擎。內存存儲引擎能夠在內存中存儲所有的表格數據。又或者,你也許需要一個支持事務處理的數據庫(以確保事務處理不成功時數據的回退能力)。
這些不同的技術以及配套的相關功能在MySQL中被稱作存儲引擎(也稱作表類型)。
MySQL默認配置了許多不同的存儲引擎,可以預先設置或者在MySQL服務器中啟用。你可以選擇適用於服務器、數據庫和表格的存儲引擎,以便在選擇如何存儲你的信息、如何檢索這些信息以及你需要你的數據結合什麼性能和功能的時候為你提供最大的靈活性。
選擇如何存儲和檢索你的數據的這種靈活性是MySQL為什麼如此受歡迎的主要原因。其它數據庫系統 (包括大多數商業選擇)僅支持一種類型的數據存儲 。
遺憾的是,其它類型的數據庫解決方案採取的「一個尺碼滿足一切需求」的方式意味着你要麼就犧牲一些性能,要麼你就用幾個小時甚至幾天的時間詳細調整你的數據庫。使用MySQL,我們僅需要修改我們使用的存儲引擎就可以了。
'''
1.2 MySQL 支持哪些存儲引擎:
mysql5.6支持的存儲引擎包括:
InnoDB:
MySql 5.6 版本默認的存儲引擎。InnoDB 是一個事務安全的存儲引擎,它具備提交、回滾以及崩潰恢復的功能以保護用戶數據。InnoDB 的行級別鎖定以及 Oracle 風格的一致性無鎖讀提升了它的多用戶並發數以及性能。InnoDB 將用戶數據存儲在聚集索引中以減少基於主鍵的普通查詢所帶來的 I/O 開銷。為了保證數據的完整性,InnoDB 還支持外鍵約束。
MyISAM:
MyISAM既不支持事務、也不支持外鍵、其優勢是訪問速度快,但是表級別的鎖定限制了它在讀寫負載方面的性能,因此它經常應用於只讀或者以讀為主的數據場景。
Memory:
在內存中存儲所有數據,應用於對非關鍵數據由快速查找的場景。Memory類型的表訪問數據非常快,因為它的數據是存放在內存中的,並且默認使用HASH索引,但是一旦服務關閉,表中的數據就會丟失
BLACKHOLE:
黑洞存儲引擎,類似於 Unix 的 /dev/null,Archive 只接收但卻並不保存數據。對這種引擎的表的查詢常常返回一個空集。這種表可以應用於 DML 語句需要發送到從服務器,但主服務器並不會保留這種數據的備份的主從配置中。
CSV:
它的表真的是以逗號分隔的文本文件。CSV 表允許你以 CSV 格式導入導出數據,以相同的讀和寫的格式和腳本和應用交互數據。由於 CSV 表沒有索引,你最好是在普通操作中將數據放在 InnoDB 表裡,只有在導入或導出階段使用一下 CSV 表。
NDB:
(又名 NDBCLUSTER)——這種集群數據引擎尤其適合於需要最高程度的正常運行時間和可用性的應用。注意:NDB 存儲引擎在標準 MySql 5.6 版本里並不被支持。目前能夠支持MySql 集群的版本有:基於 MySql 5.1 的 MySQL Cluster NDB 7.1;基於 MySql 5.5 的 MySQL Cluster NDB 7.2;基於 MySql 5.6 的 MySQL Cluster NDB 7.3。同樣基於 MySql 5.6 的 MySQL Cluster NDB 7.4 目前正處於研發階段。
Merge:
允許 MySql DBA 或開發者將一系列相同的 MyISAM 表進行分組,並把它們作為一個對象進行引用。適用於超大規模數據場景,如數據倉庫。
Federated:
提供了從多個物理機上聯接不同的 MySql 服務器來創建一個邏輯數據庫的能力。適用於分佈式或者數據市場的場景。
Example:
這種存儲引擎用以保存闡明如何開始寫新的存儲引擎的 MySql 源碼的例子。它主要針對於有興趣的開發人員。這種存儲引擎就是一個啥事也不做的 「存根」。你可以使用這種引擎創建表,但是你無法向其保存任何數據,也無法從它們檢索任何索引。
二:各種儲存引擎的特性
2.1 概括
MySQL服務器採用了多層設計和獨立模塊,插件式存儲引擎體系結構,允許將存儲引擎加載到正在運新的MySQL服務器中,圖中的Pluggable Storage Engines部分。採用MySQL服務器體系結構,由於在存儲級別上(也就是Pluggable Storage Engines)提供了一致和簡單的應用模型和API,應用程序編程人員和DBA可不再考慮所有的底層實施細節。因此,儘管不同的存儲引擎具有不同的能力,應用程序是與之分離的。存儲引擎就司職與文件系統打交道了。
2.2 各種存儲引擎的特徵
-
並發性:某些應用程序比其他應用程序具有很多的顆粒級鎖定要求(如行級鎖定)。
-
事務支持:並非所有的應用程序都需要事務,但對的確需要事務的應用程序來說,有着定義良好的需求,如ACID兼容等。
-
引用完整性:通過DDL定義的外鍵,服務器需要強制保持關聯數據庫的引用完整性。
-
物理存儲:它包括各種各樣的事項,從表和索引的總的頁大小,到存儲數據所需的格式,到物理磁盤。
-
索引支持:不同的應用程序傾向於採用不同的索引策略,每種存儲引擎通常有自己的編製索引方法,但某些索引方法(如B-tree索引)對幾乎所有的存儲引擎來說是共同的。
-
內存高速緩衝:與其他應用程序相比,不同的應用程序對某些內存高速緩衝策略的響應更好,因此,儘管某些內存高速緩衝對所有存儲引擎來說是共同的(如用於用戶連接的高速緩衝,MySQL的高速查詢高速緩衝等),其他高速緩衝策略僅當使用特殊的存儲引擎時才唯一定義。
-
性能幫助:包括針對並行操作的多I/O線程,線程並發性,數據庫檢查點,成批插入處理等。
-
其他目標特性:可能包括對地理空間操作的支持,對特定數據處理操作的安全限制等。
以上要求會在不同的需求中予以體現,通過單獨一個系統實現是不可能的,以上特點有些本身就是相互矛盾的,魚和熊掌的問題。對以上內容做些選擇,形成的存儲引擎就是一個插件引擎了,某些特定的需求可以使用。如下圖,部分現有的存儲引擎以及基本特點:
三:常用儲存引擎及應用場景
InnoDB:用於事務處理應用程序,支持外鍵和行級鎖。如果應用對事物的完整性有比較高的要求,在並發條件下要求數據的一致性,數據操作除了插入和查詢之外,還包括很多更新和刪除操作,那麼InnoDB存儲引擎是比較合適的。InnoDB除了有效的降低由刪除和更新導致的鎖定,還可以確保事務的完整提交和回滾,對於類似計費系統或者財務系統等對數據準確要求性比較高的系統都是合適的選擇。
MyISAM:如果應用是以讀操作和插入操作為主,只有很少的更新和刪除操作,並且對事務的完整性、並發性要求不高,那麼可以選擇這個存儲引擎。
Memory:將所有的數據保存在內存中,在需要快速定位記錄和其他類似數據的環境下,可以提供極快的訪問。Memory的缺陷是對錶的大小有限制,雖然數據庫因為異常終止的話數據可以正常恢復,但是一旦數據庫關閉,存儲在內存中的數據都會丟失。
四:儲存引擎在MySQL 中的使用
# 查看所有的存儲引擎
show engines;
在建表時指定:
mysql> create table ai(id bigint(12),name varchar(200)) ENGINE=MyISAM;
mysql> create table country(id int(4),cname varchar(50)) ENGINE=InnoDB;
# 也可以使用alter table語句,修改一個已經存在的表的存儲引擎。
mysql> alter table ai engine = innodb;
在配置文件中指定:
# my.ini文件
[mysqld]
default-storage-engine=INNODB
五:MySQL 的工作流程
5.1 MySQL架構總共四層,在上圖中以虛線作為劃分。
-
最上層的服務並不是MySQL獨有的,大多數給予網絡的客戶端/服務器的工具或者服務都有類似的架構。比如:連接處理、授權認證、安全等。
-
第二層的架構包括大多數的MySQL的核心服務。包括:查詢解析、分析、優化、緩存以及所有的內置函數(例如:日期、時間、數學和加密函數)。同時,所有的跨存儲引擎的功能都在這一層實現:存儲過程、觸發器、視圖等。
-
第三層包含了存儲引擎。存儲引擎負責MySQL中數據的存儲和提取。服務器通過API和存儲引擎進行通信。這些接口屏蔽了不同存儲引擎之間的差異,使得這些差異對上層的查詢過程透明化。存儲引擎API包含十幾個底層函數,用於執行「開始一個事務」等操作。但存儲引擎一般不會去解析SQL(InnoDB會解析外鍵定義,因為其本身沒有實現該功能),不同存儲引擎之間也不會相互通信,而只是簡單的響應上層的服務器請求。
-
第四層包含了文件系統,所有的表結構和數據以及用戶操作的日誌最終還是以文件的形式存儲在硬盤上。
-