日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

高质量解读《高性能mysql》——第1章 MySQL架构与历史

發(fā)布時(shí)間:2023/12/10 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高质量解读《高性能mysql》——第1章 MySQL架构与历史 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言:

高效讀書(shū),一張邏輯圖帶你讀懂、讀薄書(shū)中重點(diǎn)。

深入學(xué)習(xí)MySQL系列,解讀的目的是為了把書(shū)讀薄,抽出重點(diǎn)進(jìn)行梳理、理解、運(yùn)用。因大量文字很容易讓人覺(jué)得枯燥無(wú)味,為此博主花費(fèi)一定精力和時(shí)間整理輸出為邏輯思維圖,以便大家學(xué)習(xí)和參考。

--------------------------------------------------------------------------------------
注:下面文字只是對(duì)邏輯思維圖的”翻譯“,節(jié)省時(shí)間,只看圖即可。

目錄

MySQL架構(gòu)與歷史邏輯思維圖

MySQL邏輯架構(gòu)

連接管理與安全性

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

并發(fā)控制

讀寫(xiě)鎖

鎖粒度

鎖策略

事務(wù)

特性

隔離級(jí)別

死鎖

事務(wù)日志

MySQL中的事務(wù)

多版本并發(fā)控制

MySQL存儲(chǔ)引擎

InnoDB 存儲(chǔ)引擎

MyISAM 存儲(chǔ)引擎

MySQL 內(nèi)建的其他存儲(chǔ)引擎

第三方存儲(chǔ)引擎

選擇合適的引擎

轉(zhuǎn)換表的引擎

MySQL時(shí)間線

MySQL開(kāi)發(fā)模式

總結(jié)


MySQL架構(gòu)與歷史邏輯思維圖

MySQL架構(gòu)與歷史

?

MySQL邏輯架構(gòu)

三層架構(gòu)

第一層 連接/線程處理

連接處理、授權(quán)認(rèn)證、安全認(rèn)證等

第二層 MySQL核心服務(wù)

查詢(xún)解析、分析、優(yōu)化、緩存以及所有內(nèi)置函數(shù)等

所有跨存儲(chǔ)引擎的功能:存儲(chǔ)過(guò)程、觸發(fā)器、視圖等

第三層 存儲(chǔ)引擎

負(fù)責(zé)MySQL中數(shù)據(jù)的存儲(chǔ)和提取

服務(wù)器通過(guò)API與存儲(chǔ)引擎進(jìn)行通信,API屏蔽了不同存儲(chǔ)引擎之間的差異

存儲(chǔ)引擎不會(huì)去解析SQL,不同存儲(chǔ)引擎之間也不會(huì)相互通信

連接管理與安全性

每個(gè)客戶(hù)端連接對(duì)應(yīng)一個(gè)線程。服務(wù)器會(huì)負(fù)責(zé)緩存,不需要每一個(gè)新建的連接創(chuàng)建或者銷(xiāo)毀線程

認(rèn)證基于用戶(hù)名、原始主機(jī)信息和密碼

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

解析查詢(xún),創(chuàng)建內(nèi)部數(shù)據(jù)結(jié)構(gòu)(解析樹(shù))。用戶(hù)可以請(qǐng)求優(yōu)化解釋(explain)優(yōu)化過(guò)程的各個(gè)因素

優(yōu)化器并不關(guān)心使用的是什么存儲(chǔ)引擎,但是存儲(chǔ)引擎對(duì)于優(yōu)化查詢(xún)有影響

在解析查詢(xún)SQL之前,服務(wù)器會(huì)優(yōu)先檢查查詢(xún)緩存(Query Cache)

并發(fā)控制

多個(gè)查詢(xún)?nèi)绻谕粫r(shí)刻修改數(shù)據(jù),都會(huì)產(chǎn)生并發(fā)控制的問(wèn)題

讀寫(xiě)鎖

讀鎖是共享的,或者說(shuō)是相互不阻塞的

寫(xiě)鎖是排他的,也就是說(shuō)一個(gè)寫(xiě)鎖會(huì)阻塞其他的寫(xiě)鎖和讀鎖

目的:確保在給定的時(shí)間里,只有一個(gè)用戶(hù)能執(zhí)行寫(xiě)入,并防止其他用戶(hù)讀取正在寫(xiě)入的同一資源

鎖粒度

目的:提高共享資源并發(fā)性的方式,讓鎖定的對(duì)象更有選擇性

只鎖定需要修改的部分?jǐn)?shù)據(jù),而不是全部資源

只會(huì)對(duì)修改的數(shù)據(jù)片進(jìn)行精確的鎖定

鎖策略

就是在鎖的開(kāi)銷(xiāo)和數(shù)據(jù)的安全性之間尋求平衡

表鎖(talbe lock)

MySQL中最基本的鎖策略,并且是開(kāi)銷(xiāo)最小的策略

行級(jí)鎖(row lock)

可以最大程度地支持并發(fā)處理(同時(shí)也帶來(lái)了最大的鎖開(kāi)銷(xiāo))

事務(wù)

概念:事務(wù)就是一組原子性的SQL查詢(xún),或者說(shuō)是一個(gè)獨(dú)立的工作單元

特性

原子性(atomicity)

原子的概念就是不可分割,你可以把它理解為組成物質(zhì)的基本單位,也是我們進(jìn)行數(shù)據(jù)處理操作的基本單位。

一致性(consistency)

一致性指的就是數(shù)據(jù)庫(kù)在進(jìn)行事務(wù)操作后,會(huì)由原來(lái)的一致?tīng)顟B(tài),變成另一種一致的狀態(tài)。也就是說(shuō)當(dāng)事務(wù)提交后,或者當(dāng)事務(wù)發(fā)生回滾后,數(shù)據(jù)庫(kù)的完整性約束不能被破壞。

隔離性(isolation)

它指的是每個(gè)事務(wù)都是彼此獨(dú)立的,不會(huì)受到其他事務(wù)的執(zhí)行影響。也就是說(shuō)一個(gè)事務(wù)在提交之前,對(duì)其他事務(wù)都是不可見(jiàn)的。

持久性(durability)

事務(wù)提交之后對(duì)數(shù)據(jù)的修改是持久性的,即使在系統(tǒng)出故障的情況下,比如系統(tǒng)崩潰或者存儲(chǔ)介質(zhì)發(fā)生故障,數(shù)據(jù)的修改依然是有效的。因?yàn)楫?dāng)事務(wù)完成,數(shù)據(jù)庫(kù)的日志就會(huì)被更新,這時(shí)可以通過(guò)日志,讓系統(tǒng)恢復(fù)到最后一次成功的更新?tīng)顟B(tài)。

事務(wù)的四大特性概括

在這四個(gè)特性中,原子性是基礎(chǔ),隔離性是手段,一致性是約束條件,而持久性是我們的目的

隔離級(jí)別

READ UNCOMMITTED(未提交讀)

事務(wù)中的修改,即使沒(méi)提交,對(duì)其他事務(wù)也都是可見(jiàn)的

事務(wù)可以讀取未提交的數(shù)據(jù),稱(chēng)為:臟讀(Dirty Read)

實(shí)際應(yīng)用中一般很少使用

READ COMMITTED(提交讀)

大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)的默認(rèn)級(jí)別都是READ COMMITTED(MySQL不是)

一個(gè)事務(wù)開(kāi)始時(shí),只能“看見(jiàn)”已經(jīng)提交的事務(wù)所做的修改

這個(gè)級(jí)別有時(shí)候也叫做:不可重復(fù)讀(nonrepeatableread),因?yàn)閮纱螆?zhí)行同樣的查詢(xún),可能會(huì)得到不一樣的結(jié)果

REPEATABLE READ(可重復(fù)讀)

該級(jí)別保證了在同一個(gè)事務(wù)中多次讀取同樣的記錄的結(jié)果是一致的

無(wú)法解決幻讀(Phantom Read)的問(wèn)題,幻讀:指的是當(dāng)某個(gè)事務(wù)在讀取某個(gè)范圍內(nèi)的記錄時(shí),另一個(gè)事務(wù)又在該范圍內(nèi)插入了新的記錄,當(dāng)之前的事務(wù)再次讀取該范圍的記錄時(shí),會(huì)產(chǎn)生幻行(Phantom Row)

可重復(fù)讀是MySQL的默認(rèn)事務(wù)隔離級(jí)別

SERIALIZABLE(可串行化)

最高的隔離級(jí)別

通過(guò)強(qiáng)制事務(wù)串行執(zhí)行,避免了幻讀的問(wèn)題

實(shí)際應(yīng)用中很少用,只有當(dāng)非常確保數(shù)據(jù)的一致性且可以接受沒(méi)有并發(fā)的情況下,才考慮采用該級(jí)別

死鎖

概念:指兩個(gè)或者多個(gè)事務(wù)在同一資源上相互占用,并請(qǐng)求鎖定對(duì)方占用的資源,從而導(dǎo)致惡性循環(huán)的現(xiàn)象

可能產(chǎn)生情況

當(dāng)多個(gè)事務(wù)試圖以不同的順序鎖定資源時(shí)

當(dāng)多個(gè)事務(wù)同時(shí)鎖定同一個(gè)資源時(shí)(當(dāng)兩個(gè)事務(wù)都等待對(duì)方釋放鎖,同時(shí)又持有對(duì)方需要的鎖)

如何解決

死鎖檢測(cè)。檢測(cè)到死鎖的循環(huán)依賴(lài),并立即返回一個(gè)錯(cuò)誤

死鎖超時(shí)機(jī)制。當(dāng)查詢(xún)的時(shí)間達(dá)到鎖等待超時(shí)的設(shè)定后放棄鎖請(qǐng)求

大多數(shù)情況下,只需要重新執(zhí)行因死鎖回滾的事務(wù)即可

事務(wù)日志

目的:提高事務(wù)效率

使用事務(wù)日志,只需修改其內(nèi)存,再把修改行為記錄到硬盤(pán)的事務(wù)日志中

事務(wù)日志持久化以后,內(nèi)存中被修改的數(shù)據(jù)在后臺(tái)再慢慢地刷回到磁盤(pán)

MySQL中的事務(wù)

MySQL 兩種事務(wù)型的存儲(chǔ)引擎:InnoDB和NDB Cluster

自動(dòng)提交(AUTOCOMMIT)

MySQL默認(rèn)采用自動(dòng)提交(AUTOCOMMIT)模式。意思就是每個(gè)查詢(xún)都被當(dāng)做一個(gè)事務(wù)提交操作

在事務(wù)中混合使用存儲(chǔ)引擎

隱式和顯式鎖定

多版本并發(fā)控制

可以認(rèn)為MVCC是行級(jí)鎖的一個(gè)變種,但是它在很多情況下避免了加鎖操作,因此開(kāi)銷(xiāo)更低

MVCC的實(shí)現(xiàn),是通過(guò)保存數(shù)據(jù)在某個(gè)時(shí)間點(diǎn)的快照來(lái)實(shí)現(xiàn)的

InnoDB的MVCC,是通過(guò)在每行記錄后面保存兩個(gè)隱藏的列來(lái)實(shí)現(xiàn)的

MVCC 只在REPEATABLE READ(可重復(fù)讀)和READ COMMITTED(提交讀)兩個(gè)隔離級(jí)別下工作。其他兩個(gè)隔離級(jí)別都和MVCC不兼容

MySQL存儲(chǔ)引擎

InnoDB 存儲(chǔ)引擎

InnoDB是MySQL的默認(rèn)事務(wù)型引擎,也是最重要、使用最廣泛的存儲(chǔ)引擎

它被設(shè)計(jì)用來(lái)處理大量的短期(short-lived)事務(wù),短期事務(wù)大部分情況是正常提交的,很少會(huì)被回滾

InnoDB的性能和自動(dòng)崩潰恢復(fù)特性,使得它在非事務(wù)型存儲(chǔ)的需求中也很流行

概覽

InnoDB的數(shù)據(jù)存儲(chǔ)在表空間(tablespace)中,表空間是由InnoDB管理的一個(gè)黑盒子,由一系列的數(shù)據(jù)文件組成

InnoDB 采用MVCC來(lái)支持高并發(fā),并且實(shí)現(xiàn)了四個(gè)標(biāo)準(zhǔn)的隔離級(jí)別

InnoDB表是基于聚簇索引建立的

InnoDB內(nèi)部做了很多優(yōu)化,包括從磁盤(pán)讀取數(shù)據(jù)時(shí)采用的可預(yù)測(cè)性預(yù)讀,能夠自動(dòng)在內(nèi)存中創(chuàng)建hash索引加速讀操作,以及能夠加速插入操作的插入緩沖區(qū)等

InnoDB的行為是非常復(fù)雜的

InnoDB通過(guò)一些機(jī)制和工具支持真正的熱備份

MyISAM 存儲(chǔ)引擎

相關(guān)描述

在MySQL 5.1及之前的版本,MyISAM是默認(rèn)的存儲(chǔ)引擎

MyISAM提供了大量的特性,包含全文索引、壓縮、空間函數(shù)等

MyISAM不支持事務(wù)和行級(jí)鎖,且崩潰后無(wú)法安全恢復(fù)

存儲(chǔ)

MyISAM會(huì)將表存儲(chǔ)在兩個(gè)文件中:數(shù)據(jù)文件和索引文件,分別以.MYD和.MYI為擴(kuò)展名

MyISAM表如果是變長(zhǎng)行,則默認(rèn)配置只能處理256TB的數(shù)據(jù)

特性

加鎖與并發(fā)

MyISAM對(duì)整張表加鎖,而不是針對(duì)行

修復(fù)

MySQL可以手動(dòng)或者自動(dòng)執(zhí)行檢查和修復(fù)操作

索引特性

即使是BLOB和TEXT等長(zhǎng)字段,也可以基于前500個(gè)字符創(chuàng)建索引;也支持全文索引

延遲更新索引鍵(Delayed Key Write)

壓縮表

壓縮表不能進(jìn)行修改;可以極大地減少磁盤(pán)空間占用和磁盤(pán)I/O

壓縮時(shí)表中的記錄是獨(dú)立壓縮的,所以讀取單行時(shí)不需要去解壓整個(gè)表

性能

設(shè)計(jì)簡(jiǎn)單,數(shù)據(jù)以緊密格式存儲(chǔ),所以某些場(chǎng)景下性能很好

MySQL 內(nèi)建的其他存儲(chǔ)引擎

Archive 引擎

只支持INSERT和SELECT操作,在MySQL5.1前不支持索引

會(huì)緩存所有的寫(xiě)并利用zlib對(duì)插入的行進(jìn)行壓縮,所以比MyISAM表的磁盤(pán)I/O更少

支持行級(jí)鎖和專(zhuān)用的緩存區(qū),可以實(shí)現(xiàn)高并發(fā)插入

適用場(chǎng)景

日志或者數(shù)據(jù)采集

需要更快速的INSERT操作的場(chǎng)景

Blackhole 引擎

沒(méi)有實(shí)現(xiàn)任何存儲(chǔ)機(jī)制

可以用于復(fù)制數(shù)據(jù)到備庫(kù),或者簡(jiǎn)單地記錄到日志

CSV 引擎

可以將普通的CSV文件(逗號(hào)分割)作為MySQL表來(lái)處理,但是不支持索引

Federated 引擎

是訪問(wèn)其他MySQL服務(wù)器的一個(gè)代理

Memory 引擎

快速訪問(wèn)數(shù)據(jù),且數(shù)據(jù)不會(huì)被修改,重啟后丟失也沒(méi)關(guān)系的情景

比MyISAM表要快一個(gè)數(shù)量級(jí)

重啟后,結(jié)構(gòu)還會(huì)保留,數(shù)據(jù)會(huì)丟失

適用場(chǎng)景

用于查找或者映射表,比如講郵編和地市名映射的表

用戶(hù)緩存數(shù)據(jù)

用戶(hù)保存數(shù)據(jù)分析中產(chǎn)生的中間數(shù)據(jù)

Merge 引擎

是MyISAM引擎的一個(gè)變種,由多個(gè)MyISAM表合并而來(lái)的虛擬表

NDB 集群引擎

作為SQL和NDB原生協(xié)議之間的接口

第三方存儲(chǔ)引擎

OLTP 類(lèi)引擎

是基于InnoDB引擎的一個(gè)改進(jìn)版本。改進(jìn)點(diǎn)主要集中在性能、可測(cè)量性和操作靈活性方面

面向列的存儲(chǔ)引擎

MySQL默認(rèn)是面向行的,每一行的數(shù)據(jù)都是一起存儲(chǔ)的,服務(wù)器的查詢(xún)也是以行為單位處理的

面向列的存儲(chǔ)方式,在大數(shù)據(jù)量處理時(shí),可能效率更高,傳輸更少的數(shù)據(jù),每一列的單獨(dú)存儲(chǔ),壓縮效率也會(huì)更高

社區(qū)存儲(chǔ)引擎

Aria、Groonga、OQGraph等

選擇合適的引擎

除非需要用到某些InnoDB不具備的特性,并且沒(méi)有其他辦法可以替代,否則都應(yīng)該優(yōu)先選擇InnoDB引擎

如果應(yīng)用需要不同的存儲(chǔ)引擎,考慮因素如下

事務(wù)

備份

崩潰恢復(fù)

特有的特性

常見(jiàn)應(yīng)用場(chǎng)景

日志型應(yīng)用

實(shí)時(shí)記錄請(qǐng)求日志

插入速度快,MyISAM或者Archive存儲(chǔ)引擎比較合適,開(kāi)銷(xiāo)低,且插入速度快

對(duì)記錄的日志做分析報(bào)表

利用MySQL內(nèi)置的復(fù)制方案將數(shù)據(jù)復(fù)制一份到備庫(kù)

備庫(kù)上執(zhí)行耗時(shí)間和CPU的查詢(xún),主庫(kù)用于高效的插入操作,互不影響

只讀或者大部分情況下只讀的表

建議采用InnoDB

訂單處理

InnoDB是訂單處理類(lèi)應(yīng)用的最佳選擇

電子公告牌和主題討論論壇

CD-ROM應(yīng)用

可以考慮MyIsam表或者M(jìn)yIsam壓縮表

大數(shù)據(jù)量

數(shù)據(jù)倉(cāng)庫(kù)

轉(zhuǎn)換表的引擎

ALTER TABLE

ALTER TABLE mytable ENGINE=InnoDB;

導(dǎo)出與導(dǎo)入

mysqldump導(dǎo)出文件,修改文件中CREATE TABLE語(yǔ)句的存儲(chǔ)引擎選項(xiàng)

創(chuàng)建與查詢(xún)(CREATE和SELECT)

MySQL時(shí)間線

對(duì)于懷舊者,自行搜索

MySQL開(kāi)發(fā)模式

遵循GPL開(kāi)源協(xié)議

總結(jié)

擁有分層的架構(gòu)

最初基于ISAM構(gòu)建(后被MyISAM取代),后續(xù)添加了更多的存儲(chǔ)引擎和事務(wù)支持

存儲(chǔ)引擎 API 的架構(gòu)的缺點(diǎn)。除了InnoDB引擎外的存儲(chǔ)引擎,選擇可能讓事情變得更加復(fù)雜

MySQL基于GPL協(xié)議開(kāi)放全部源代碼,社區(qū)和客戶(hù)都可以獲得堅(jiān)固而穩(wěn)定的數(shù)據(jù)庫(kù),變得更加可擴(kuò)展和有價(jià)值

以上內(nèi)容均為博主原創(chuàng)手碼梳理。碼字不易,但只要能提高,都是值得的。如果您覺(jué)得,這篇文章對(duì)您的基礎(chǔ)知識(shí)學(xué)習(xí)、鞏固、提高有幫助,歡迎點(diǎn)贊、分享、收藏,謝謝。 --天天water

總結(jié)

以上是生活随笔為你收集整理的高质量解读《高性能mysql》——第1章 MySQL架构与历史的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。