国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
1.2 Server 層基本組件介紹
1) 連接器
2) 查詢緩存(MySQL 8.0 版本后移除)
3) 分析器
4) 優(yōu)化器
5) 執(zhí)行器
二 語句分析
2.1 查詢語句
2.2 更新語句
首頁 數(shù)據(jù)庫 mysql教程 SQL語句在MySQL中如何執(zhí)行?

SQL語句在MySQL中如何執(zhí)行?

Apr 11, 2019 am 11:44 AM
java mysql

本篇文章給大家?guī)淼膬?nèi)容是關(guān)于SQL語句在MySQL中如何執(zhí)行?有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

本篇文章會分析下一個 sql 語句在 MySQL 中的執(zhí)行流程,包括 sql 的查詢在 MySQL 內(nèi)部會怎么流轉(zhuǎn),sql 語句的更新是怎么完成的。

在分析之前我會先帶著你看看 MySQL 的基礎(chǔ)架構(gòu),知道了 MySQL 由那些組件組成已經(jīng)這些組件的作用是什么,可以幫助我們理解和解決這些問題。

一 MySQL 基礎(chǔ)架構(gòu)分析

1.1 MySQL 基本架構(gòu)概覽

下圖是 MySQL ?的一個簡要架構(gòu)圖,從下圖你可以很清晰的看到用戶的 SQL 語句在 MySQL 內(nèi)部是如何執(zhí)行的。

先簡單介紹一下下圖涉及的一些組件的基本作用幫助大家理解這幅圖,在 1.2 節(jié)中會詳細(xì)介紹到這些組件的作用。

連接器: 身份認(rèn)證和權(quán)限相關(guān)(登錄 MySQL 的時候)。

查詢緩存: ?執(zhí)行查詢語句的時候,會先查詢緩存(MySQL 8.0 版本后移除,因為這個功能不太實用)。

分析器: ?沒有命中緩存的話,SQL 語句就會經(jīng)過分析器,分析器說白了就是要先看你的 SQL 語句要干嘛,再檢查你的 SQL 語句語法是否正確。

優(yōu)化器: ?按照 MySQL 認(rèn)為最優(yōu)的方案去執(zhí)行。

執(zhí)行器: 執(zhí)行語句,然后從存儲引擎返回數(shù)據(jù)。

966406137-5cad54b5bfeed_articlex.jpg

簡單來說 MySQL ?主要分為 Server 層和存儲引擎層:

Server 層:主要包括連接器、查詢緩存、分析器、優(yōu)化器、執(zhí)行器等,所有跨存儲引擎的功能都在這一層實現(xiàn),比如存儲過程、觸發(fā)器、視圖,函數(shù)等,還有一個通用的日志模塊 binglog 日志模塊。

存儲引擎: 主要負(fù)責(zé)數(shù)據(jù)的存儲和讀取,采用可以替換的插件式架構(gòu),支持 InnoDB、MyISAM、Memory 等多個存儲引擎,其中 InnoDB 引擎有自有的日志模塊 redolog 模塊。現(xiàn)在最常用的存儲引擎是 InnoDB,它從 MySQL 5.5.5 版本開始就被當(dāng)做默認(rèn)存儲引擎了。

1.2 Server 層基本組件介紹

1) 連接器

連接器主要和身份認(rèn)證和權(quán)限相關(guān)的功能相關(guān),就好比一個級別很高的門衛(wèi)一樣。

主要負(fù)責(zé)用戶登錄數(shù)據(jù)庫,進行用戶的身份認(rèn)證,包括校驗賬戶密碼,權(quán)限等操作,如果用戶賬戶密碼已通過,連接器會到權(quán)限表中查詢該用戶的所有權(quán)限,之后在這個連接里的權(quán)限邏輯判斷都是會依賴此時讀取到的權(quán)限數(shù)據(jù),也就是說,后續(xù)只要這個連接不斷開,即時管理員修改了該用戶的權(quán)限,該用戶也是不受影響的。

2) 查詢緩存(MySQL 8.0 版本后移除)

查詢緩存主要用來緩存我們所執(zhí)行的 SELECT 語句以及該語句的結(jié)果集。

連接建立后,執(zhí)行查詢語句的時候,會先查詢緩存,MySQL 會先校驗這個 sql 是否執(zhí)行過,以 Key-Value 的形式緩存在內(nèi)存中,Key 是查詢預(yù)計,Value 是結(jié)果集。如果緩存 key 被命中,就會直接返回給客戶端,如果沒有命中,就會執(zhí)行后續(xù)的操作,完成后也會把結(jié)果緩存起來,方便下一次調(diào)用。當(dāng)然在真正執(zhí)行緩存查詢的時候還是會校驗用戶的權(quán)限,是否有該表的查詢條件。

MySQL 查詢不建議使用緩存,因為查詢緩存失效在實際業(yè)務(wù)場景中可能會非常頻繁,假如你對一個表更新的話,這個表上的所有的查詢緩存都會被清空。對于不經(jīng)常更新的數(shù)據(jù)來說,使用緩存還是可以的。

所以,一般在大多數(shù)情況下我們都是不推薦去使用查詢緩存的。

MySQL 8.0 版本后刪除了緩存的功能,官方也是認(rèn)為該功能在實際的應(yīng)用場景比較少,所以干脆直接刪掉了。

3) 分析器

MySQL 沒有命中緩存,那么就會進入分析器,分析器主要是用來分析 SQL 語句是來干嘛的,分析器也會分為幾步:

第一步,詞法分析,一條 SQL 語句有多個字符串組成,首先要提取關(guān)鍵字,比如 select,提出查詢的表,提出字段名,提出查詢條件等等。做完這些操作后,就會進入第二步。

第二步,語法分析,主要就是判斷你輸入的 sql 是否正確,是否符合 MySQL 的語法。

完成這 2 步之后,MySQL 就準(zhǔn)備開始執(zhí)行了,但是如何執(zhí)行,怎么執(zhí)行是最好的結(jié)果呢?這個時候就需要優(yōu)化器上場了。

4) 優(yōu)化器

優(yōu)化器的作用就是它認(rèn)為的最優(yōu)的執(zhí)行方案去執(zhí)行(有時候可能也不是最優(yōu),這篇文章涉及對這部分知識的深入講解),比如多個索引的時候該如何選擇索引,多表查詢的時候如何選擇關(guān)聯(lián)順序等。

可以說,經(jīng)過了優(yōu)化器之后可以說這個語句具體該如何執(zhí)行就已經(jīng)定下來。

5) 執(zhí)行器

當(dāng)選擇了執(zhí)行方案后,MySQL 就準(zhǔn)備開始執(zhí)行了,首先執(zhí)行前會校驗該用戶有沒有權(quán)限,如果沒有權(quán)限,就會返回錯誤信息,如果有權(quán)限,就會去調(diào)用引擎的接口,返回接口執(zhí)行的結(jié)果。

二 語句分析

2.1 查詢語句

說了以上這么多,那么究竟一條 sql 語句是如何執(zhí)行的呢?其實我們的 sql 可以分為兩種,一種是查詢,一種是更新(增加,更新,刪除)。我們先分析下查詢語句,語句如下:

select?*?from?tb_student??A?where?A.age='18'?and?A.name='?張三?';

結(jié)合上面的說明,我們分析下這個語句的執(zhí)行流程:

先檢查該語句是否有權(quán)限,如果沒有權(quán)限,直接返回錯誤信息,如果有權(quán)限,在 MySQL8.0 版本以前,會先查詢緩存,以這條 sql 語句為 key 在內(nèi)存中查詢是否有結(jié)果,如果有直接緩存,如果沒有,執(zhí)行下一步。

通過分析器進行詞法分析,提取 sql 語句的關(guān)鍵元素,比如提取上面這個語句是查詢 select,提取需要查詢的表名為 tb_student,需要查詢所有的列,查詢條件是這個表的 id='1'。然后判斷這個 sql 語句是否有語法錯誤,比如關(guān)鍵詞是否正確等等,如果檢查沒問題就執(zhí)行下一步。

接下來就是優(yōu)化器進行確定執(zhí)行方案,上面的 sql 語句,可以有兩種執(zhí)行方案:

??a.先查詢學(xué)生表中姓名為“張三”的學(xué)生,然后判斷是否年齡是?18。
??b.先找出學(xué)生中年齡?18?歲的學(xué)生,然后再查詢姓名為“張三”的學(xué)生。

那么優(yōu)化器根據(jù)自己的優(yōu)化算法進行選擇執(zhí)行效率最好的一個方案(優(yōu)化器認(rèn)為,有時候不一定最好)。那么確認(rèn)了執(zhí)行計劃后就準(zhǔn)備開始執(zhí)行了。

進行權(quán)限校驗,如果沒有權(quán)限就會返回錯誤信息,如果有權(quán)限就會調(diào)用數(shù)據(jù)庫引擎接口,返回引擎的執(zhí)行結(jié)果。

2.2 更新語句

以上就是一條查詢 sql 的執(zhí)行流程,那么接下來我們看看一條更新語句如何執(zhí)行的呢?sql 語句如下:

update?tb_student?A?set?A.age='19'?where?A.name='?張三?';

我們來給張三修改下年齡,在實際數(shù)據(jù)庫肯定不會設(shè)置年齡這個字段的,不然要被技術(shù)負(fù)責(zé)人打的。其實條語句也基本上會沿著上一個查詢的流程走,只不過執(zhí)行更新的時候肯定要記錄日志啦,這就會引入日志模塊了,MySQL 自帶的日志模塊式 binlog(歸檔日志) ,所有的存儲引擎都可以使用,我們常用的 InnoDB 引擎還自帶了一個日志模塊 redo log(重做日志),我們就以 InnoDB 模式下來探討這個語句的執(zhí)行流程。流程如下:

先查詢到張三這一條數(shù)據(jù),如果有緩存,也是會用到緩存。

然后拿到查詢的語句,把 age 改為 19,然后調(diào)用引擎 API 接口,寫入這一行數(shù)據(jù),InnoDB 引擎把數(shù)據(jù)保存在內(nèi)存中,同時記錄 redo log,此時 redo log 進入 prepare 狀態(tài),然后告訴執(zhí)行器,執(zhí)行完成了,隨時可以提交。

執(zhí)行器收到通知后記錄 binlog,然后調(diào)用引擎接口,提交 redo log 為提交狀態(tài)。

更新完成。

這里肯定有同學(xué)會問,為什么要用兩個日志模塊,用一個日志模塊不行嗎?

這是因為最開始 MySQL 并沒與 InnoDB 引擎( InnoDB 引擎是其他公司以插件形式插入 MySQL 的) ,MySQL 自帶的引擎是 MyISAM,但是我們知道 redo log 是 InnoDB 引擎特有的,其他存儲引擎都沒有,這就導(dǎo)致會沒有 crash-safe 的能力(crash-safe 的能力即使數(shù)據(jù)庫發(fā)生異常重啟,之前提交的記錄都不會丟失),binlog 日志只能用來歸檔。

并不是說只用一個日志模塊不可以,只是 InnoDB 引擎就是通過 redo log 來支持事務(wù)的。那么,又會有同學(xué)問,我用兩個日志模塊,但是不要這么復(fù)雜行不行,為什么 redo log 要引入 prepare 預(yù)提交狀態(tài)?這里我們用反證法來說明下為什么要這么做?

先寫 redo log 直接提交,然后寫 binlog,假設(shè)寫完 redo log 后,機器掛了,binlog 日志沒有被寫入,那么機器重啟后,這臺機器會通過 redo log 恢復(fù)數(shù)據(jù),但是這個時候 bingog 并沒有記錄該數(shù)據(jù),后續(xù)進行機器備份的時候,就會丟失這一條數(shù)據(jù),同時主從同步也會丟失這一條數(shù)據(jù)。

先寫 binlog,然后寫 redo log,假設(shè)寫完了 binlog,機器異常重啟了,由于沒有 redo log,本機是無法恢復(fù)這一條記錄的,但是 binlog 又有記錄,那么和上面同樣的道理,就會產(chǎn)生數(shù)據(jù)不一致的情況。

如果采用 redo log 兩階段提交的方式就不一樣了,寫完 binglog 后,然后再提交 redo log 就會防止出現(xiàn)上述的問題,從而保證了數(shù)據(jù)的一致性。那么問題來了,有沒有一個極端的情況呢?假設(shè) redo log 處于預(yù)提交狀態(tài),binglog 也已經(jīng)寫完了,這個時候發(fā)生了異常重啟會怎么樣呢?
這個就要依賴于 MySQL 的處理機制了,MySQL 的處理過程如下:

判斷 redo log 是否完整,如果判斷是完整的,就立即提交。

如果 redo log 只是預(yù)提交但不是 commit 狀態(tài),這個時候就會去判斷 binlog 是否完整,如果完整就提交 redo log, 不完整就回滾事務(wù)。

這樣就解決了數(shù)據(jù)一致性的問題。

三 總結(jié)

MySQL 主要分為 Server 曾和引擎層,Server 層主要包括連接器、查詢緩存、分析器、優(yōu)化器、執(zhí)行器,同時還有一個日志模塊(binlog),這個日志模塊所有執(zhí)行引擎都可以共用,redolog 只有 InnoDB 有。

引擎層是插件式的,目前主要包括,MyISAM,InnoDB,Memory 等。

查詢語句的執(zhí)行流程如下:權(quán)限校驗(如果命中緩存)---》查詢緩存---》分析器---》優(yōu)化器---》權(quán)限校驗---》執(zhí)行器---》引擎

更新語句執(zhí)行流程如下:分析器----》權(quán)限校驗----》執(zhí)行器---》引擎---redo log(prepare 狀態(tài)---》binlog---》redo log(commit狀態(tài))【相關(guān)推薦:MySQL教程

以上是SQL語句在MySQL中如何執(zhí)行?的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276
如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動提交模式,再執(zhí)行多個操作,最后根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時應(yīng)使用try-with-resources管理資源,妥善處理異常并關(guān)閉連接,避免連接泄漏;此外建議使用連接池、設(shè)置保存點實現(xiàn)部分回滾,并保持事務(wù)盡可能短以提升性能。

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

垃圾收集如何在Java工作? 垃圾收集如何在Java工作? Aug 02, 2025 pm 01:55 PM

Java的垃圾回收(GC)是自動管理內(nèi)存的機制,通過回收不可達對象釋放堆內(nèi)存,減少內(nèi)存泄漏風(fēng)險。1.GC從根對象(如棧變量、活動線程、靜態(tài)字段等)出發(fā)判斷對象可達性,無法到達的對象被標(biāo)記為垃圾。2.基于標(biāo)記-清除算法,標(biāo)記所有可達對象,清除未標(biāo)記對象。3.采用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時較長的MajorGC;Metaspace存儲類元數(shù)據(jù)。4.JVM提供多種GC器:SerialGC適用于小型應(yīng)用;ParallelGC提升吞吐量;CMS降

比較Java構(gòu)建工具:Maven vs. Gradle 比較Java構(gòu)建工具:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

Gradleisthebetterchoiceformostnewprojectsduetoitssuperiorflexibility,performance,andmoderntoolingsupport.1.Gradle’sGroovy/KotlinDSLismoreconciseandexpressivethanMaven’sverboseXML.2.GradleoutperformsMaveninbuildspeedwithincrementalcompilation,buildcac

如何使用Java中的觀察者模式? 如何使用Java中的觀察者模式? Aug 02, 2025 am 11:52 AM

該問題的明確答案是推薦使用自定義觀察者接口實現(xiàn)觀察者模式。1.雖然Java提供了Observable和Observer,但前者是類且已棄用,缺乏靈活性;2.現(xiàn)代推薦做法是定義函數(shù)式Observer接口,由Subject維護Observer列表并在狀態(tài)變化時通知所有觀察者;3.可結(jié)合Lambda表達式使用,提升代碼簡潔性與可維護性;4.對于GUI或JavaBean場景,可選用PropertyChangeListener。因此,新項目應(yīng)采用自定義觀察者接口方案,它類型安全、易于測試且與現(xiàn)代Java特

Java并發(fā)公用事業(yè):執(zhí)行人員服務(wù)和叉/加入 Java并發(fā)公用事業(yè):執(zhí)行人員服務(wù)和叉/加入 Aug 03, 2025 am 01:54 AM

ExecutorService適用于獨立任務(wù)的異步執(zhí)行,如I/O操作或定時任務(wù),使用線程池管理并發(fā),通過submit提交Runnable或Callable任務(wù),并用Future獲取結(jié)果,需注意無界隊列風(fēng)險和顯式關(guān)閉線程池;2.Fork/Join框架專為可拆分的CPU密集型任務(wù)設(shè)計,基于分治法和工作竊取算法,通過RecursiveTask或RecursiveAction實現(xiàn)任務(wù)遞歸拆分,由ForkJoinPool調(diào)度執(zhí)行,適合大數(shù)組求和、排序等場景,需合理設(shè)置拆分閾值避免開銷;3.選擇依據(jù):獨立任

如何將MySQL Server升級到較新的版本? 如何將MySQL Server升級到較新的版本? Aug 03, 2025 am 09:04 AM

CheckcompatibilitywithOS,applications,andfeatures;2.Backupalldata,configs,andlogs;3.Chooseupgrademethod(packagemanager,MySQLInstaller,ormanual);4.Runpost-upgradechecksandtests;5.Resolveissueslikeauthenticationpluginsordeprecatedoptions.Alwaysbackup,t

使用HTML'輸入類型”作為用戶數(shù)據(jù) 使用HTML'輸入類型”作為用戶數(shù)據(jù) Aug 03, 2025 am 11:07 AM

選擇合適的HTMLinput類型能提升數(shù)據(jù)準(zhǔn)確性、增強用戶體驗并提高可用性。1.根據(jù)數(shù)據(jù)類型選用對應(yīng)input類型,如text、email、tel、number和date,可實現(xiàn)自動校驗和適配鍵盤;2.利用HTML5新增類型如url、color、range和search,可提供更直觀的交互方式;3.配合使用placeholder和required屬性,可提升表單填寫效率和正確率,但需注意placeholder不能替代label。

See all articles