MySQL之存儲引擎使用及說明
一、mysql存儲引擎概述
1.1 存儲引擎
MySQL中的數(shù)據(jù)用各種不同的技術(shù)存儲在文件(或者內(nèi)存)中。
這些技術(shù)中的每一種技術(shù)都使用不同的存儲機制、索引技巧、鎖定水平并且最終提供廣泛的不同的功能和能力。
通過選擇不同的技術(shù),你能夠獲得額外的速度或者功能,從而改善你的應(yīng)用的整體功能。
例如,如果研究大量的臨時數(shù)據(jù),你也許需要使用內(nèi)存存儲引擎。內(nèi)存存儲引擎能夠在內(nèi)存中存儲所有的表格數(shù)據(jù)。
這些不同的技術(shù)以及配套的相關(guān)功能在MySQL中被稱作存儲引擎(也稱作表類型)。
MySQL默認(rèn)配置了許多不同的存儲引擎,可以預(yù)先設(shè)置或者在MySQL服務(wù)器中啟用。你可以選擇適用于服務(wù)器、數(shù)據(jù)庫和表格的存儲引擎,以便在選擇如何存儲你的信息、如何檢索這些信息以及你需要你的數(shù)據(jù)結(jié)合什么性能和功能的時候為你提供最大的靈活性。
選擇如何存儲和檢索你的數(shù)據(jù)的這種靈活性是MySQL為什么如此受歡迎的主要原因。其它數(shù)據(jù)庫系統(tǒng) (包括大多數(shù)商業(yè)選擇)僅支持一種類型的數(shù)據(jù)存儲 。
1.2 mysql支持的存儲引擎
mysql5.6支持的存儲引擎包括
InnoDB
MyISAM
MEMORY
CSV
BLACKHOLE
FEDERATED
MRG_MYISAM
ARCHIVE
PERFORMANCE_SCHEMA
- 其中NDB和InnoDB提供事務(wù)安全表,其他存儲引擎都是非事務(wù)安全表。
二、各種存儲引擎的特性
- 并發(fā)性:某些應(yīng)用程序比其他應(yīng)用程序具有很多的顆粒級鎖定要求(如行級鎖定)。
- 事務(wù)支持:并非所有的應(yīng)用程序都需要事務(wù),但對的確需要事務(wù)的應(yīng)用程序來說,有著定義良好的需求,如ACID兼容等。
- 引用完整性:通過DDL定義的外鍵,服務(wù)器需要強制保持關(guān)聯(lián)數(shù)據(jù)庫的引用完整性。
- 物理存儲:它包括各種各樣的事項,從表和索引的總的頁大小,到存儲數(shù)據(jù)所需的格式,到物理磁盤。
- 索引支持:不同的應(yīng)用程序傾向于采用不同的索引策略,每種存儲引擎通常有自己的編制索引方法,但某些索引方法(如B-tree索引)對幾乎所有的存儲引擎來說是共同的。
- 內(nèi)存高速緩沖:與其他應(yīng)用程序相比,不同的應(yīng)用程序?qū)δ承﹥?nèi)存高速緩沖策略的響應(yīng)更好,因此,盡管某些內(nèi)存高速緩沖對所有存儲引擎來說是共同的(如用于用戶連接的高速緩沖,MySQL的高速查詢高速緩沖等),其他高速緩沖策略僅當(dāng)使用特殊的存儲引擎時才唯一定義。
- 性能幫助:包括針對并行操作的多I/O線程,線程并發(fā)性,數(shù)據(jù)庫檢查點,成批插入處理等。
- 其他目標(biāo)特性:可能包括對地理空間操作的支持,對特定數(shù)據(jù)處理操作的安全限制等。
三、各種搜索引擎介紹
InnoDB
:MySql 5.6 版本默認(rèn)的存儲引擎。InnoDB 是一個事務(wù)安全的存儲引擎,它具備提交、回滾以及崩潰恢復(fù)的功能以保護(hù)用戶數(shù)據(jù)。InnoDB 的行級別鎖定以及 Oracle 風(fēng)格的一致性無鎖讀提升了它的多用戶并發(fā)數(shù)以及性能。InnoDB 將用戶數(shù)據(jù)存儲在聚集索引中以減少基于主鍵的普通查詢所帶來的 I/O 開銷。為了保證數(shù)據(jù)的完整性,InnoDB 還支持外鍵約束。MyISAM
:MyISAM既不支持事務(wù)、也不支持外鍵、其優(yōu)勢是訪問速度快,但是表級別的鎖定限制了它在讀寫負(fù)載方面的性能,因此它經(jīng)常應(yīng)用于只讀或者以讀為主的數(shù)據(jù)場景。Memory
:在內(nèi)存中存儲所有數(shù)據(jù),應(yīng)用于對非關(guān)鍵數(shù)據(jù)由快速查找的場景。Memory類型的表訪問數(shù)據(jù)非??欤驗樗臄?shù)據(jù)是存放在內(nèi)存中的,并且默認(rèn)使用HASH索引,但是一旦服務(wù)關(guān)閉,表中的數(shù)據(jù)就會丟失BLACKHOLE
:黑洞存儲引擎,類似于 Unix 的 /dev/null,Archive 只接收但卻并不保存數(shù)據(jù)。對這種引擎的表的查詢常常返回一個空集。這種表可以應(yīng)用于 DML 語句需要發(fā)送到從服務(wù)器,但主服務(wù)器并不會保留這種數(shù)據(jù)的備份的主從配置中。CSV
:它的表真的是以逗號分隔的文本文件。CSV 表允許你以 CSV 格式導(dǎo)入導(dǎo)出數(shù)據(jù),以相同的讀和寫的格式和腳本和應(yīng)用交互數(shù)據(jù)。由于 CSV 表沒有索引,你最好是在普通操作中將數(shù)據(jù)放在 InnoDB 表里,只有在導(dǎo)入或?qū)С鲭A段使用一下 CSV 表。NDB
:(又名 NDBCLUSTER)——這種集群數(shù)據(jù)引擎尤其適合于需要最高程度的正常運行時間和可用性的應(yīng)用。注意:NDB 存儲引擎在標(biāo)準(zhǔn) 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 目前正處于研發(fā)階段。Merge
:允許 MySql DBA 或開發(fā)者將一系列相同的 MyISAM 表進(jìn)行分組,并把它們作為一個對象進(jìn)行引用。適用于超大規(guī)模數(shù)據(jù)場景,如數(shù)據(jù)倉庫。Federated
:提供了從多個物理機上聯(lián)接不同的 MySql 服務(wù)器來創(chuàng)建一個邏輯數(shù)據(jù)庫的能力。適用于分布式或者數(shù)據(jù)市場的場景。Example
:這種存儲引擎用以保存闡明如何開始寫新的存儲引擎的 MySql 源碼的例子。它主要針對于有興趣的開發(fā)人員。這種存儲引擎就是一個啥事也不做的 “存根”。你可以使用這種引擎創(chuàng)建表,但是你無法向其保存任何數(shù)據(jù),也無法從它們檢索任何索引。
四、存儲引擎相關(guān)sql語句
# 查看當(dāng)前的默認(rèn)存儲引擎: mysql> show variables like "default_storage_engine"; # 查詢當(dāng)前數(shù)據(jù)庫支持的存儲引擎 mysql> show engines \G;
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語句,修改一個已經(jīng)存在的表的存儲引擎。 mysql> alter table ai engine = innodb;
# my.ini文件 [mysqld] default-storage-engine=INNODB
五、mysql的工作流程
MySQL架構(gòu)總共四層,在上圖中以虛線作為劃分。
- 最上層的服務(wù)并不是MySQL獨有的,大多數(shù)給予網(wǎng)絡(luò)的客戶端/服務(wù)器的工具或者服務(wù)都有類似的架構(gòu)。比如:連接處理、授權(quán)認(rèn)證、安全等。
- 第二層的架構(gòu)包括大多數(shù)的MySQL的核心服務(wù)。包括:查詢解析、分析、優(yōu)化、緩存以及所有的內(nèi)置函數(shù)(例如:日期、時間、數(shù)學(xué)和加密函數(shù))。同時,所有的跨存儲引擎的功能都在這一層實現(xiàn):存儲過程、觸發(fā)器、視圖等。
- 第三層包含了存儲引擎。存儲引擎負(fù)責(zé)MySQL中數(shù)據(jù)的存儲和提取。服務(wù)器通過API和存儲引擎進(jìn)行通信。這些接口屏蔽了不同存儲引擎之間的差異,使得這些差異對上層的查詢過程透明化。存儲引擎API包含十幾個底層函數(shù),用于執(zhí)行“開始一個事務(wù)”等操作。但存儲引擎一般不會去解析SQL(InnoDB會解析外鍵定義,因為其本身沒有實現(xiàn)該功能),不同存儲引擎之間也不會相互通信,而只是簡單的響應(yīng)上層的服務(wù)器請求。
- 第四層包含了文件系統(tǒng),所有的表結(jié)構(gòu)和數(shù)據(jù)以及用戶操作的日志最終還是以文件的形式存儲在硬盤上。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL存儲表情時報錯:java.sql.SQLException: Incorrect string value:‘
這篇文章主要給大家介紹了關(guān)于MySQL存儲表情時報錯:java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\xA9\x0D\x0A...'的解決方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2018-04-04Mysql誤操作后利用binlog2sql快速回滾的方法詳解
相信每個和數(shù)據(jù)庫打交道的程序員都會碰一個問題,MySQL誤操作后如何快速回滾?那么下面這篇文章主要給大家介紹了關(guān)于Mysql誤操作后利用binlog2sql快速回滾的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考下。2017-07-07Django連接本地mysql數(shù)據(jù)庫(pycharm)的步驟
這篇文章主要介紹了Django連接本地mysql數(shù)據(jù)庫(pycharm)的步驟,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09Windows服務(wù)器下MySql數(shù)據(jù)庫單向主從備份詳細(xì)實現(xiàn)步驟分享
將主服務(wù)器中的MySql數(shù)據(jù)庫同步到從服務(wù)器中,使得對主服務(wù)器的操作可以即時更新到從服務(wù)器,避免主服務(wù)器因環(huán)境或者網(wǎng)絡(luò)異常一時無法使用,達(dá)到備份效果,這篇文章整理的確實挺詳細(xì)的2012-05-05MySQL查詢語句過程和EXPLAIN語句基本概念及其優(yōu)化
在MySQL中我們經(jīng)常會使用到一些查詢語句,如果使用合適的索引會大大簡化和加速查找,下面小編來和大家一起學(xué)習(xí)一下知識2019-05-05mysql獲取字符串長度函數(shù)(CHAR_LENGTH)
本文介紹一下關(guān)于mysql獲取字符串長度的方法,希望此教程對各位同學(xué)會有所幫助哦。2013-11-11