一:MySQL 存盤引擎概述
1.1 什么是存盤引擎:
'''
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會決議外鍵定義,因為其本身沒有實作該功能),不同存盤引擎之間也不會相互通信,而只是簡單的回應上層的服務器請求,
-
第四層包含了檔案系統,所有的表結構和資料以及用戶操作的日志最侄訓是以檔案的形式存盤在硬碟上,
-
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/280922.html
標籤:其他
上一篇:Docker下安裝Redis
