MySQL的架構(gòu)和歷史是怎樣的

MySQL的架構(gòu)和歷史是怎樣的,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、網(wǎng)站制作、玄武網(wǎng)絡(luò)推廣、重慶小程序開發(fā)、玄武網(wǎng)絡(luò)營銷、玄武企業(yè)策劃、玄武品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學生創(chuàng)業(yè)者提供玄武建站搭建服務(wù),24小時服務(wù)熱線:028-86922220,官方網(wǎng)址:muchs.cn

MySQL架構(gòu)和歷史

1.處理和存儲分離的設(shè)計

MySQL最重要,最與眾不同的特性是它的可插拔式存儲引擎架構(gòu)(將查詢處理,系統(tǒng)任務(wù),數(shù)據(jù)的存儲,提取相分離)。

2.架構(gòu):

層級作用備注
連接層連接處理,授權(quán)認證等RDMS共有設(shè)計
服務(wù)層查詢解析,緩存,分析優(yōu)化,內(nèi)置函數(shù),跨引擎功能MySQL核心服務(wù)與功能,服務(wù)層未設(shè)計外鍵
引擎層負責數(shù)據(jù)存儲與提取底層函數(shù),不會解析SQL,不同引擎直接不在此層級互相通信,僅響應(yīng)來自上層的請求。處理外鍵

3.優(yōu)化與執(zhí)行

服務(wù)層解析查詢,創(chuàng)建解析樹,然后進行重寫查詢,決定表的讀取順序,選擇合適的索引等。在此步,用戶可以通過hint關(guān)鍵字或者force index影響優(yōu)化器的決策,也可以通過explain命令查看優(yōu)化器如何優(yōu)化決策。

優(yōu)化器不關(guān)心表使用什么引擎,但存儲引擎對優(yōu)化查詢是有影響的。

4.鎖

讀鎖是共享的,相互不阻塞。

寫鎖是排他的,相互阻塞,在給定的時間內(nèi),同一行數(shù)據(jù),只能有一個用戶正在進行寫入。

大多數(shù)時候,MySQL鎖的內(nèi)部管理都是透明的。

在給定的資源上,鎖定的數(shù)據(jù)量越少,則系統(tǒng)的并發(fā)讀越高。

加鎖需要消耗資源,如果系統(tǒng)花費大量時間來管理鎖,而不是存取數(shù)據(jù),則系統(tǒng)的性能可能會因此收到影響。

一般會在鎖的開銷和數(shù)據(jù)的安全性之間尋求平衡,即在表上施加行級鎖。

每種MySQL引擎都可以實現(xiàn)自己的鎖傾向和鎖粒度。

寫鎖比讀鎖有更高的優(yōu)先級,并發(fā)時,寫鎖請求可能會被插入到隊列的最前端,但讀鎖最多只能排在其他讀鎖的最前端。

服務(wù)層會對涉及到整個表的內(nèi)容的更改使用表級鎖,引擎層的鎖機制被忽略。

行級鎖只在存儲引擎層實現(xiàn)。

InnoDB采用兩段鎖定協(xié)議,在事務(wù)執(zhí)行過程中,隨時都可以執(zhí)行鎖定,但只有在整個事務(wù)提交或者回滾時才會同一時間釋放該事務(wù)占有的所有鎖?![式鎖’

服務(wù)層可以使用LOCK TABLE或者UNLOCK TABLE,但可能會和事務(wù)產(chǎn)生相互影響產(chǎn)生不可預(yù)料的后果,盡量不要在業(yè)務(wù)進行時中使用。

5.事務(wù)

事務(wù)就是一組原子性的SQL查詢,一組獨立的工作單元。事務(wù)內(nèi)的語句要么全部執(zhí)行完,要么全部失敗。

一個完備的數(shù)據(jù)庫系統(tǒng)需要滿足ACID特征:

Atomictiy 原子性:一個事務(wù)視為不可分割的最小單元。

Consistency 一致性: 數(shù)據(jù)庫總是從一個一致性的狀態(tài)轉(zhuǎn)換到另一個一致性的狀態(tài)。

    Isolation 隔離性: 一個事務(wù)所做的修改在最終提交之前,對其事務(wù)是不可見的。

Durability 持久性:一旦提交,永久保存,不受系統(tǒng)崩潰影響。

一個實現(xiàn)了ACID特性的數(shù)據(jù)庫,需要更強的硬件。

即使存儲引擎不支持事務(wù),但還可以通過lock table來提供部分ACID特性。

非事務(wù)型的表只能自動提交。

事務(wù)型的表在執(zhí)行DDL操作或者lock table時會強行commit當前的活動事務(wù)

隔離級別(ANSI)

READ UNCOMMITED(未提交讀):事務(wù)中未提交的修改也會被其他事務(wù)讀到,’臟讀‘,性能不會好太多。

READ COMMITED(提交讀):事務(wù)中提交后的修改會被其他事務(wù)讀到,但會造成不可重復(fù)讀。MSSQL,ORACLE

READ REPEATABLE(可重復(fù)讀):事務(wù)中多次讀取同一條數(shù)據(jù)值相同,但新插入的不算,即主鍵范圍讀可能不一致,'幻讀',MySQL默認級別。

SEARIALIZE(串行):取消并行,完全串行,悲觀鎖。

可以通過set [session] transaction isolation level [RU|RC|RR|SX]設(shè)置隔離級別,全局性設(shè)置在下一個事務(wù)開始時生效,會話級設(shè)置只對當前事務(wù)有效

隔離級別臟讀可能性不可重復(fù)讀幻讀可能性加鎖讀
RUYYYN
RCNYYN
RRNNYN
SXNNNY

死鎖

兩個或以上的事務(wù)爭用同一組資源,并請求鎖定對方占用的資源。

處理辦法:完備的RDMS包含了死鎖檢測與死鎖超時機制。

InnoDB:將持有最少行級X鎖的事務(wù)進行回滾。

死鎖在事務(wù)型RDMS中是無法避免的,死鎖發(fā)生后,只有部分或者完全回滾其中一個事務(wù)才能打破窘境。

事務(wù)日志(redo)

可以提高事務(wù)的效率,存儲引擎在修改表的數(shù)據(jù)時只需要修改其內(nèi)存拷貝,再批量地把修改的行為記錄到硬盤上的事務(wù)日志文件中。

事務(wù)日志采用了正向追加的方式,保證了寫入時的 順序IO。批量記錄修改的行為時,事務(wù)日志持久后,可以在后臺將內(nèi)存中的數(shù)據(jù)慢慢刷回磁盤

6.多版本并發(fā)控制(MVCC)

MVCC是行級鎖的一個變種,在很多情況下避免了加鎖的操作,且只在RR和RC隔離級別下工作。

MVCC是通過保存數(shù)據(jù)行在某個時間點的快照來實現(xiàn)的。

根據(jù)事務(wù)開始時間的不同,每個事務(wù)對同一張表,同一時刻看到的數(shù)據(jù)可能是不一樣的。

InnoDB的MVCC,是通過在每個記錄(包括已經(jīng)存入undo中的記錄)后面保存兩個隱藏的版本號來實現(xiàn)的。即:該數(shù)據(jù)創(chuàng)建時的系統(tǒng)版本號和該數(shù)據(jù)失效時的系統(tǒng)版本號。

其他事務(wù):

SELECT時:只查找比當前事務(wù)創(chuàng)建更早的行(極端情況下,在此事務(wù)中對此行進行了修改或創(chuàng)建,即讀取本事務(wù)中被修改后此行的數(shù)據(jù))。

INSERT時:為新插入的此行保存本事務(wù)版本的版本號作為此行的創(chuàng)建版本號。同時若在此事務(wù)中不在對此行進行修改,則行過期版本號留空

DELETE時:將本事務(wù)的版本號賦給被刪除行的失效版本號

UPDATE時:將本事務(wù)的版本號賦給被修改行的失效版本號,同時插入被修改后的數(shù)據(jù),同時把本事務(wù)的版本號付給新插入的修改后的數(shù)據(jù)的創(chuàng)建版本號。

保留這兩個額外版本號,可以使大多數(shù)讀操作都不用加S鎖,但這些多余的行會占用undo空間。建議將undo從共享表空間中獨立出來,并減小事務(wù)長度。

7.存儲引擎

不同引擎保存數(shù)據(jù)和索引的方式是不同的,但表的定義是在服務(wù)層統(tǒng)一處理的。

通過show table status顯示表的相關(guān)信息

屬性屬性值說明
Name:user表名
Engine:InnoDB存儲引擎
Row_format:Dynamic行格式,變長行
Rows3對應(yīng)InnoDB,估計的行數(shù)值
Avg_row_length5461平均每行字節(jié)數(shù)
Data_length16384表數(shù)據(jù)字節(jié)數(shù)
Max_data_length0表最大字節(jié)數(shù)(InnoDB無限制)
Index_length0非主鍵索引占用字節(jié)數(shù)
Data_free4194304已分配但未使用的字節(jié)數(shù)
Auto_incrementNULL下個自增值的起始點
Create_time2018-01-24 20:02:01創(chuàng)建時間
Update_timeNULL最后一次的更新時間
Check_timeNULLCHECK TABLE命令使用的時間
Collationutf8_bin該表默認字符集與排序規(guī)則
ChecksumNULL(若啟用校驗)校驗和
Create_optionsstats_persistent=0建表時的其他非默認選項
CommentUsers and privileges表的備注

InnoDB引擎被設(shè)計用來處理大量短期事務(wù)(大部分情況下正常提交),正常情況下默認使用InnoDB引擎,MySQL8.0版本,將mysql庫中的表也從MyISAM更換為InnoDB引擎。

InnoDB引擎一直朝著可測量性,可擴展性,可配置化,性能,更多新特性的方向演進。

InnoDB引擎概覽

InnoDB的數(shù)據(jù)存儲在表空間中,推薦使用獨立表空間,即將各個表的數(shù)據(jù)和索引放在單獨的文件中。

InnoDB使用MVCC來支持高并發(fā),并且實現(xiàn)了四個標準的隔離級別。默認隔離級別為可重復(fù)讀RR,并且通過間隙鎖的機制解決了范圍讀可能因為新插入值導(dǎo)致出現(xiàn)幻讀的問題。

間隙鎖通過在本來鎖定查詢設(shè)計的行同事,還會對索引中的間隙進行鎖定,防止插入新的行。

InnoDB表是基于聚簇索引建立的,即索引組織表。這種設(shè)計,使得對主鍵的進行的查詢效率很高。其二級索引,即非聚集索引(普通索引,非主鍵索引)是通過鏈接的方式指向其對應(yīng)的主鍵位置,即二級索引中包含了主鍵列。這就會產(chǎn)生一個主鍵列長度很大,其他索引的大小也會同樣很大的問題。這個特性要求我們主鍵列的最大長度盡量減小。

InnoDB引擎表的文件存儲格式是獨立的,某種程度上可以跨平臺使用。

InnoDB的顯著優(yōu)化特點:從磁盤讀取數(shù)據(jù)時的可預(yù)測性讀,引入了能夠在內(nèi)存中創(chuàng)建Hash索引來加速讀操作的自適應(yīng)哈希索引(adaptive hash index),能夠加速插入操作的插入緩沖區(qū)(insert buffer,對非主鍵非唯一性索引進行緩存,每10s合并到非主鍵索引中)。

InnoDB引擎的表支持熱物理備份(非邏輯備份成sql文件)即XtraBackup或者官方的Enterprise Backup

有趣的CSV引擎

可以將Excel文件另存為CSV格式,放入MySQL數(shù)據(jù)目錄下,即可在MySQL中打開使用。

慢慢棄用的引擎:

Federated引擎,本來設(shè)計用于建立Oracle,SQL server到MySQL的數(shù)據(jù)聯(lián)系紐帶,后被用于創(chuàng)建跨實例連接(類似于SQL server中的同義詞或者鏈接服務(wù)器),但經(jīng)常帶來問題,默認禁用,MariaDB提供了一個改進版的FederatedX。

Memory引擎,數(shù)據(jù)只存在內(nèi)存中,重啟后表結(jié)構(gòu)留存,但數(shù)據(jù)會全部丟失。支持HASH索引,表級鎖,并發(fā)低,行長度固定。

第三方常用存儲引擎:

XtraDB引擎,Percona公司基于InnoDB引擎的改進版本

TokuDB引擎,基于分形樹索引的引擎,具有較高的壓縮比,可以在很大的數(shù)據(jù)量上創(chuàng)建索引。

Infobright引擎,列組織的引擎,面向大數(shù)據(jù)設(shè)計。

更改表的存儲引擎:alter table t1 engine = InnoDB; 執(zhí)行過程中會創(chuàng)建相同表結(jié)構(gòu)不同引擎的一張新表,然后按行將數(shù)據(jù)從原表讀入到新表中,會進行鎖表,消耗大量系統(tǒng)IO,盡量不要在業(yè)務(wù)高峰期進行,或者使用pt-online-schema-change的工具進行在線修改。

關(guān)于MySQL的架構(gòu)和歷史是怎樣的問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。

分享文章:MySQL的架構(gòu)和歷史是怎樣的
網(wǎng)站地址:http://muchs.cn/article14/ihdhge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、定制開發(fā)、品牌網(wǎng)站制作、網(wǎng)站建設(shè)、定制網(wǎng)站、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)