成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入剖析 MySQL 某條執(zhí)行過程

數(shù)據(jù)庫(kù) MySQL
本文將以專業(yè)且深入的視角,對(duì)一條 MySQL 執(zhí)行過程展開全面而細(xì)致的解析,旨在揭示其中蘊(yùn)含的關(guān)鍵步驟和邏輯,帶領(lǐng)讀者一同領(lǐng)略 MySQL 執(zhí)行機(jī)制的精妙與嚴(yán)謹(jǐn)。

在當(dāng)今的信息技術(shù)領(lǐng)域,MySQL 作為廣泛應(yīng)用的數(shù)據(jù)庫(kù)管理系統(tǒng),其重要性不言而喻。當(dāng)我們執(zhí)行一條 MySQL 語(yǔ)句時(shí),看似簡(jiǎn)單的操作背后,實(shí)則隱藏著一個(gè)嚴(yán)謹(jǐn)而有序的執(zhí)行過程。深入探究這一過程,對(duì)于理解數(shù)據(jù)庫(kù)的運(yùn)作原理以及優(yōu)化數(shù)據(jù)庫(kù)性能都具有至關(guān)重要的意義。本文將以專業(yè)且深入的視角,對(duì)一條 MySQL 執(zhí)行過程展開全面而細(xì)致的解析,旨在揭示其中蘊(yùn)含的關(guān)鍵步驟和邏輯,帶領(lǐng)讀者一同領(lǐng)略 MySQL 執(zhí)行機(jī)制的精妙與嚴(yán)謹(jǐn)。

一、詳解MySQL基本架構(gòu)

從宏觀角度來(lái)說(shuō)MySQL架構(gòu)可以分為server層和存儲(chǔ)引擎層,其中Server層核心組件如下:

  • 連接器:進(jìn)行身份認(rèn)證和權(quán)限相關(guān)校驗(yàn)。
  • 查詢緩存:查詢緩存主要是用于提高查詢效率而加的一層緩存,但在MySQL8.0已廢棄。
  • 分析器:對(duì)SQL執(zhí)行動(dòng)作、語(yǔ)法、詞法進(jìn)行分析。
  • 優(yōu)化器:對(duì)要被執(zhí)行的SQL進(jìn)行優(yōu)化。
  • 執(zhí)行器:執(zhí)行SQL查詢語(yǔ)句,然后從存儲(chǔ)引擎返回結(jié)果。

接下來(lái)說(shuō)說(shuō)存儲(chǔ)引擎,對(duì)于MySQL而言存儲(chǔ)引擎是支持插拔的,常見的存儲(chǔ)引擎有myisam、innodb、memory,而MySQL默認(rèn)的使用的是innodb。

二、詳解MySQL各層的組件分工內(nèi)容與職責(zé)

1. MySQL客戶端和服務(wù)端的通信協(xié)議

對(duì)于MySQL而言,客戶端和服務(wù)端之間采用的是一種半雙工的通信協(xié)議,這樣就意味著同一時(shí)刻要么客戶端向服務(wù)端發(fā)送數(shù)據(jù),要么服務(wù)端向客戶端發(fā)送數(shù)據(jù)。所以客戶端必須完整的收到服務(wù)端響應(yīng)的數(shù)據(jù)才能斷開連接。

這個(gè)交互流程也在告訴我們,進(jìn)行大量數(shù)據(jù)查詢的時(shí)候,若無(wú)必要盡可能使用limit進(jìn)行分頁(yè)查詢,避免這種半雙工的通信方式導(dǎo)致客戶端接收導(dǎo)致資源長(zhǎng)時(shí)間的占用。

2. 連接器

主要判斷用戶登錄的賬戶密碼是否正確,如果賬戶密碼都正確,則進(jìn)行權(quán)限查詢,注意在本次連接期間只要不斷開,無(wú)論外界如何修改權(quán)限,這個(gè)會(huì)話的權(quán)限都是以連接器查詢到的為主。

3. 查詢緩存

MySQL8已經(jīng)廢棄的功能,這個(gè)功能常用于結(jié)果的緩存復(fù)用以提高查詢性能,例如我們進(jìn)行select * from table where id=1的查詢。第一次發(fā)現(xiàn)緩存中沒有,就從數(shù)據(jù)庫(kù)中查出來(lái)并放到緩存中下次可以在復(fù)用。 MySQL8之所以廢棄是因?yàn)閿?shù)據(jù)庫(kù)中的數(shù)據(jù)經(jīng)常更新導(dǎo)致緩存失效,就需要清空這個(gè)緩存,這期間和開銷是非常沒必要的,所以索性廢掉這個(gè)功能。

這里筆者也補(bǔ)充一下MySQL8廢棄查詢緩存的原因:

  • 鎖競(jìng)爭(zhēng):為了保存查詢緩存正確性,我們必須在多線程讀寫操作時(shí)針對(duì)特定緩存進(jìn)行鎖定保證臨界資源的線程安全,這勢(shì)必導(dǎo)致高并發(fā)場(chǎng)景下因?yàn)榫彺骀i競(jìng)爭(zhēng)而出現(xiàn)性能瓶頸。
  • 緩存失效:在進(jìn)行insert或者update修改時(shí),MySQL都會(huì)將表級(jí)緩存清空,所以針對(duì)寫多的場(chǎng)景下查詢緩存命中率不高。
  • 內(nèi)存負(fù)擔(dān):為緩存數(shù)據(jù)就需要一定的內(nèi)存空間,如果查詢和表的量級(jí)都十分龐大的話,那么就需要占用較大的內(nèi)存資源。
  • 維護(hù)成本:查詢緩存的存在增加了MySQL的復(fù)雜性,為保存緩存一致性,針對(duì)緩存添加、刪除等邏輯都需要有更加完善且復(fù)雜的舉措,這勢(shì)必增加開發(fā)和維護(hù)的成本,容易導(dǎo)致各種潛在的錯(cuò)誤和性能問題。

4. 分析器

分析器主要是負(fù)責(zé)SQL解析和預(yù)處理,它會(huì)將客戶端發(fā)來(lái)的查詢一句進(jìn)行解析生成一顆解析樹,然后解析器根據(jù)自定義規(guī)則對(duì)SQL語(yǔ)句進(jìn)行詞法和語(yǔ)法分析和語(yǔ)義分析。

  • 詞法分析:分析關(guān)鍵字是否拼寫有誤,并通過關(guān)鍵字判斷這條SQL做什么。
  • 語(yǔ)法分析:對(duì)這條SQL語(yǔ)句的語(yǔ)法進(jìn)行檢查。
  • 語(yǔ)義分析:完成上述步驟后,分析器會(huì)解析出對(duì)應(yīng)的表名和查詢條件,將其放到MySQL服務(wù)器內(nèi)部的特定數(shù)據(jù)結(jié)構(gòu)上開始后續(xù)的步驟。

5. 優(yōu)化器

分析器分析無(wú)誤之后,說(shuō)明這條語(yǔ)句是可以正常執(zhí)行的。MySQL優(yōu)化器就會(huì)通過分析找出成本最小的一種方式生成執(zhí)行計(jì)劃,交由執(zhí)行器執(zhí)行。

對(duì)此,我們這里不妨補(bǔ)充一下MySQL能夠自己處理的一些優(yōu)化類型:

將外連接轉(zhuǎn)為內(nèi)連接:某些場(chǎng)景之下,我們可能會(huì)用到外連接,但是在where或者庫(kù)表結(jié)構(gòu)的調(diào)整之后,我們的左外連接后者右外連接可能不存在null的連接。 例如下面這段sql,我們對(duì)table2進(jìn)行左外連接,但是我們條件關(guān)聯(lián)之后,table1對(duì)應(yīng)的id值在table2中都有,那么查詢優(yōu)化器可能就會(huì)對(duì)其進(jìn)行優(yōu)化,會(huì)將其轉(zhuǎn)換為內(nèi)連接,更加精確的去匹配索要查詢的行避免沒必要的掃描。

SELECT *
FROM table1
LEFT JOIN table2
ON table1.id = table2.id;

舉個(gè)例子,上面的sql如果table1對(duì)應(yīng)的id在table2中都有,那么sql語(yǔ)句就會(huì)變成這樣

SELECT *
FROM table1
LEFT JOIN table2
ON table1.id = table2.id
WHERE table2.id IS NOT NULL;

然后優(yōu)化器就會(huì)將其優(yōu)化成這樣,直接通過inner join進(jìn)行查詢,讓優(yōu)化器根據(jù)兩個(gè)表的量級(jí)讓小表驅(qū)動(dòng)大表:

SELECT *
FROM table1
inner JOIN table2
ON table1.id = table2.id;

使用代數(shù)等價(jià)變換規(guī)則,例如我們的查詢條件是5=5 and a>5,那么MySQL就會(huì)將其優(yōu)化為:a>5,再比如說(shuō)我們有這樣一條SQL,條件語(yǔ)句為(a<b and b=c) and a=5,那么MySQL就會(huì)將其優(yōu)化為: b > 5 and b=c。

優(yōu)化min、max,對(duì)于建立索引的數(shù)據(jù)表來(lái)說(shuō),使用索引所在列的進(jìn)行最大值和最小值查詢時(shí),MySQL優(yōu)化器會(huì)將這種sql判定為常數(shù)查詢,例如筆者建立的下面這張表,我們將table1的id設(shè)置為索引。 然后查詢下面這句sql:

SELECT min(id)
FROM table1;

使用explain查看其執(zhí)行計(jì)劃,可以看到執(zhí)行計(jì)劃顯示Select tables optimized away,原因很簡(jiǎn)單,這句查詢僅僅是需要table1表的id最小值即通過索引就可以直接定位到數(shù)據(jù)列,本質(zhì)上通過b+樹最左端即可:

這就意味查詢不需要通過表的維度進(jìn)行查詢,而是用一個(gè)常數(shù)查詢來(lái)代替。

預(yù)估并轉(zhuǎn)為為常數(shù)表達(dá)式:最典型的例子就select * from table1 where id=1+2,MySQL優(yōu)化器就會(huì)將其轉(zhuǎn)為select * fromt table1 where id=3。

索引掃描:這個(gè)無(wú)需多說(shuō),當(dāng)要查詢的列都包含在索引中時(shí),無(wú)需進(jìn)行回表查詢,避免沒必要的IO操作。

提前終止查詢:對(duì)于limit查詢而言,MySQL優(yōu)化器會(huì)在查詢到需要的數(shù)據(jù)時(shí)直接終止查詢,還有一些比較特殊的,例如對(duì)于某些不可能的條件,MySQL優(yōu)化器也會(huì)提前將其終止,例如我們將tbale1的id設(shè)置為主鍵,然后鍵入下面這句查詢語(yǔ)句。

selct * from table1 where id is null

那么執(zhí)行計(jì)劃就會(huì)顯示Impossible WHERE從而提前終止查詢:

6. 執(zhí)行器

對(duì)用戶進(jìn)行權(quán)限校驗(yàn),若權(quán)限校驗(yàn)不通過則報(bào)錯(cuò),然后執(zhí)行器就會(huì)根據(jù)優(yōu)化器優(yōu)化后的執(zhí)行計(jì)劃(這里的執(zhí)行計(jì)劃是一個(gè)數(shù)據(jù)結(jié)構(gòu)),執(zhí)行器根據(jù)這個(gè)數(shù)據(jù)結(jié)構(gòu)順序調(diào)用存儲(chǔ)引擎提供的API進(jìn)行數(shù)據(jù)查詢,并將查詢結(jié)果返回給客戶端,從而完成一次完整的SQL查詢。

三、用兩條完整的sql走一遍上述的流程

了解SQL執(zhí)行過程之后,我們不妨通過一個(gè)實(shí)際的例子帶入一下了解全過程。

1. 查詢語(yǔ)句的執(zhí)行流程

sql如下所示:

select * from table where b=1 and a=2;

按照我們上文所說(shuō)的過程:

  • 校驗(yàn)用戶賬戶密碼是否正確,查詢權(quán)限
  • 查詢緩存(mysql8.0之前),若有數(shù)據(jù)則直接返回,反之下一步
  • 分析器進(jìn)行詞法、語(yǔ)法分析。
  • MySQL優(yōu)化器進(jìn)行優(yōu)化,以本SQL為例,假如我們創(chuàng)建了一個(gè)聯(lián)合索引(a,b),那么優(yōu)化器就會(huì)遵循最左匹配原則將a,b條件進(jìn)行調(diào)換。

  • 進(jìn)行權(quán)限校驗(yàn),若有權(quán)限執(zhí)行器進(jìn)行查詢,將結(jié)果從引擎取出返回。

2. 更新語(yǔ)句的執(zhí)行流程

更新語(yǔ)句我們示例SQL如下:

update table set a=1  where b=1;

步驟還是一樣:

  • 連接器的工作,不多贅述
  • 查詢緩存,若有則直接操作這條數(shù)據(jù)(mysql8不走這一步)
  • 分析器的工作,不多贅述
  • 進(jìn)行更新操作,首先調(diào)用引擎API,將這個(gè)修改寫入內(nèi)存中,同時(shí)記錄redo log,此時(shí)redo log是prepare狀態(tài),然后執(zhí)行器執(zhí)行操作,完成后提交事務(wù)成功,寫入bin log,最后redo log更新為commit。
  • 更新完成。

小結(jié)

通過對(duì)這條 MySQL 執(zhí)行過程的詳盡剖析,我們清晰地了解到從語(yǔ)句輸入到最終結(jié)果輸出所經(jīng)歷的各個(gè)關(guān)鍵階段。我們看到了查詢優(yōu)化器如何智能地選擇最優(yōu)執(zhí)行計(jì)劃,索引在加速數(shù)據(jù)檢索方面的關(guān)鍵作用,以及數(shù)據(jù)存儲(chǔ)和讀取的具體機(jī)制。這不僅讓我們對(duì) MySQL 的內(nèi)部工作原理有了更深入的認(rèn)知,也為我們?cè)趯?shí)際應(yīng)用中更好地利用 MySQL 、優(yōu)化性能提供了堅(jiān)實(shí)的理論基礎(chǔ)。然而,MySQL 的奧秘遠(yuǎn)不止于此,這僅僅是一個(gè)開始,未來(lái)我們還需不斷探索和學(xué)習(xí),以更好地駕馭這一強(qiáng)大的數(shù)據(jù)庫(kù)工具。

責(zé)任編輯:趙寧寧 來(lái)源: 寫代碼的SharkChili
相關(guān)推薦

2021-09-26 09:59:14

MYSQL開發(fā)數(shù)據(jù)庫(kù)

2010-06-03 11:23:19

Hadoop

2010-07-21 14:42:15

Windows Pho

2024-05-16 10:30:54

HiveSQL任務(wù)

2024-07-29 09:49:00

SQLMySQL執(zhí)行

2021-05-31 19:50:04

MySQL自增鎖InnoDB

2009-09-27 17:13:36

Hibernate V

2011-06-03 13:48:18

JavaScript重構(gòu)

2010-06-03 13:08:51

2009-07-06 10:44:45

JSP charset

2009-09-14 15:12:40

LINQ to XML

2010-05-25 12:59:00

Subversion

2010-06-18 10:48:05

UML面向?qū)ο筌浖_發(fā)

2024-12-27 00:00:00

SQL死鎖數(shù)據(jù)庫(kù)

2010-05-27 10:23:01

SVN文檔

2010-06-30 16:00:01

FTP協(xié)議

2009-09-25 09:36:55

Hibernate核心

2010-08-04 13:52:53

Flex事件機(jī)制

2010-06-12 14:35:46

UML對(duì)象圖

2010-05-27 12:58:07

SVN升級(jí)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久国产成人精品国产成人亚洲 | 国产精品福利久久久 | 国产精品视频久久久 | 九九激情视频 | 一区二区中文 | 在线观看中文字幕av | 九九热精品视频 | 99re视频在线观看 | 337p日本欧洲亚洲大胆 | 久久影音先锋 | 久久久久亚洲 | 欧美a在线| 亚洲视频在线一区 | 国产精品久久久久一区二区三区 | 国产精品不卡一区二区三区 | 久久在线 | 国产中文字幕av | 精品视频一区二区三区在线观看 | h视频在线播放 | 国产精品一区在线 | 久久一级大片 | 91精品国产综合久久婷婷香蕉 | 国产高清精品一区二区三区 | 一区二区三区在线电影 | a级毛片毛片免费观看久潮喷 | 久久精品国产久精国产 | 欧美中文字幕一区二区 | 中文字幕一区二区三区不卡 | 99资源站 | 在线成人av | 国产成人综合久久 | 国产一区二区三区 | 黄色成人亚洲 | 亚洲国产视频一区二区 | 免费影视在线观看 | 夜夜爆操 | 久久一| 九九九视频在线 | 亚洲精品一区二区三区在线 | 亚洲精品久久久久久一区二区 | 日本免费视频 |