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

目錄
1.2 Server 層基本元件介紹
1) 連接器
2) 查詢快取(MySQL 8.0 版本後移除)
3) 分析器
4) 優(yōu)化器
5) 執(zhí)行器
二 語句分析
2.1 查詢語句
2.2 更新語句
首頁 資料庫 mysql教程 SQL語句在MySQL中如何執(zhí)行?

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

Apr 11, 2019 am 11:44 AM
java mysql

這篇文章帶給大家的內(nèi)容是關(guān)於SQL語句在MySQL中如何執(zhí)行?有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有幫助。

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

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

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

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

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

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

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

查詢快取: ?執(zhí)行查詢語句的時(shí)候,會(huì)先查詢快?。∕ySQL 8.0 版本後移除,因?yàn)檫@個(gè)功能不太實(shí)用)。

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

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

執(zhí)行器: 執(zhí)行語句,然後從儲(chǔ)存引擎?zhèn)骰刭Y料。

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

簡單來說MySQL ?主要分為Server 層與儲(chǔ)存引擎層:

Server 層:主要包含連接器、查詢快取、分析器、最佳化器、執(zhí)行器等,所有跨儲(chǔ)存引擎的功能都在這一層實(shí)現(xiàn),例如預(yù)存程序、觸發(fā)器、視圖,函數(shù)等,還有一個(gè)通用的日誌模組binglog 日誌模組。

儲(chǔ)存引擎: 主要負(fù)責(zé)資料的儲(chǔ)存與讀取,採用可取代的外掛程式架構(gòu),支援InnoDB、MyISAM、Memory 等多個(gè)儲(chǔ)存引擎,其中InnoDB 引擎有自有的日誌模組redolog 模組。 現(xiàn)在最常用的儲(chǔ)存引擎是 InnoDB,它從 MySQL 5.5.5 版本就被當(dāng)作預(yù)設(shè)儲(chǔ)存引擎了。

1.2 Server 層基本元件介紹

1) 連接器

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

主要負(fù)責(zé)使用者登入資料庫,進(jìn)行使用者的身份認(rèn)證,包括校驗(yàn)帳戶密碼,權(quán)限等操作,如果使用者帳戶密碼已通過,連接器會(huì)到權(quán)限表中查詢?cè)撌褂谜叩乃袡?quán)限,之後在這個(gè)連接裡的權(quán)限邏輯判斷都是會(huì)依賴此時(shí)讀取到的權(quán)限數(shù)據(jù),也就是說,後續(xù)只要這個(gè)連接不斷開,即時(shí)管理員修改了該用戶的權(quán)限,該用戶也是不受影響的。

2) 查詢快取(MySQL 8.0 版本後移除)

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

連線建立後,執(zhí)行查詢語句的時(shí)候,會(huì)先查詢緩存,MySQL 會(huì)先校驗(yàn)這個(gè)sql 是否執(zhí)行過,以Key-Value 的形式緩存在記憶體中,Key 是查詢預(yù)計(jì),Value 是結(jié)果集。如果快取 key 被命中,就會(huì)直接回傳給客戶端,如果沒有命中,就會(huì)執(zhí)行後續(xù)的操作,完成後也會(huì)把結(jié)果快取起來,方便下次呼叫。當(dāng)然在真正執(zhí)行快取查詢的時(shí)候還是會(huì)校驗(yàn)使用者的權(quán)限,是否有該表的查詢條件。

MySQL 查詢不建議使用緩存,因?yàn)椴樵兛烊∈г趯?shí)際業(yè)務(wù)場景中可能會(huì)非常頻繁,假如你對(duì)一個(gè)表更新的話,這個(gè)表上的所有的查詢快取都會(huì)被清空。對(duì)於不經(jīng)常更新的資料來說,使用快取還是可以的。

所以,一般在大多數(shù)情況下我們都是不建議去使用查詢快取的。

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

3) 分析器

MySQL 沒有命中緩存,那麼就會(huì)進(jìn)入分析器,分析器主要是用來分析SQL 語句是來幹嘛的,分析器也會(huì)分成幾步:

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

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

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

4) 優(yōu)化器

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

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

5) 執(zhí)行器

當(dāng)選擇了執(zhí)行方案後,MySQL 就準(zhǔn)備開始執(zhí)行了,先執(zhí)行前會(huì)校驗(yàn)該使用者有沒有權(quán)限,如果沒有權(quán)限,就會(huì)回傳錯(cuò)誤訊息,如果有權(quán)限,就會(huì)去呼叫引擎的接口,回傳接口執(zhí)行的結(jié)果。

二 語句分析

2.1 查詢語句

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

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

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

先檢查該語句是否有權(quán)限,如果沒有權(quán)限,直接傳回錯(cuò)誤訊息,如果有權(quán)限,在MySQL8.0 版本以前,會(huì)先查詢快取,以這條sql 語句為key 在記憶體中查詢是否有結(jié)果,如果有直接緩存,如果沒有,執(zhí)行下一步。

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

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

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

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

進(jìn)行權(quán)限校驗(yàn),如果沒有權(quán)限就會(huì)傳回錯(cuò)誤訊息,如果有權(quán)限就會(huì)呼叫資料庫引擎接口,傳回引擎的執(zhí)行結(jié)果。

2.2 更新語句

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

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

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

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

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

執(zhí)行器收到通知後記錄 binlog,然後呼叫引擎接口,提交 redo log 為提交狀態(tài)。

更新完成。

這裡一定有同學(xué)會(huì)問,為什麼要用兩個(gè)日誌模組,用一個(gè)日誌模組不行嗎?

這是因?yàn)樽铋_始MySQL 並沒跟InnoDB引擎( InnoDB 引擎是其他公司以插件形式插入MySQL 的) ,MySQL 自帶的引擎是MyISAM,但是我們知道redo log 是InnoDB 引擎特有的,其他儲(chǔ)存引擎都沒有,這就導(dǎo)致會(huì)沒有crash-safe 的能力(crash-safe 的能力即使資料庫發(fā)生異常重啟,之前提交的記錄都不會(huì)遺失),binlog 日誌只能用來歸檔。

並不是說只用一個(gè)日誌模組不可以,只是 InnoDB 引擎就是透過 redo log 來支援交易的。那麼,又會(huì)有同學(xué)問,我用兩個(gè)日誌模組,但不要這麼複雜行不行,為什麼 redo log 要引入 prepare 預(yù)提交狀態(tài)?這裡我們用反證法來說明為什麼要這麼做?

先寫redo log 直接提交,然後寫binlog,假設(shè)寫完redo log 後,機(jī)器掛了,binlog 日誌沒有被寫入,那麼機(jī)器重啟後,這臺(tái)機(jī)器會(huì)透過redo log 恢復(fù)數(shù)據(jù),但這個(gè)時(shí)候bingog 並沒有記錄該數(shù)據(jù),後續(xù)進(jìn)行機(jī)器備份的時(shí)候,就會(huì)丟失這一數(shù)據(jù),同時(shí)主從同步也會(huì)丟失這一數(shù)據(jù)。

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

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

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

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

這樣就解決了資料一致性的問題。

三總結(jié)

MySQL 主要分為Server 所和引擎層,Server 層主要包括連接器、查詢快取、分析器、最佳化器、執(zhí)行器,同時(shí)還有一個(gè)日誌模組(binlog),這個(gè)日誌模組所有執(zhí)行引擎都可以共用,redolog 只有InnoDB 有。

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

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

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

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

要正確處理JDBC事務(wù),必須先關(guān)閉自動(dòng)提交模式,再執(zhí)行多個(gè)操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個(gè)SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時(shí)應(yīng)使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設(shè)置保存點(diǎ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)是自動(dòng)管理內(nèi)存的機(jī)制,通過回收不可達(dá)對(duì)象釋放堆內(nèi)存,減少內(nèi)存洩漏風(fēng)險(xiǎn)。 1.GC從根對(duì)象(如棧變量、活動(dòng)線程、靜態(tài)字段等)出發(fā)判斷對(duì)象可達(dá)性,無法到達(dá)的對(duì)像被標(biāo)記為垃圾。 2.基於標(biāo)記-清除算法,標(biāo)記所有可達(dá)對(duì)象,清除未標(biāo)記對(duì)象。 3.採用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時(shí)較長的MajorGC;Metaspace存儲(chǔ)類元數(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並發(fā)公用事業(yè):執(zhí)行人員服務(wù)和叉/加入 Java並發(fā)公用事業(yè):執(zhí)行人員服務(wù)和叉/加入 Aug 03, 2025 am 01:54 AM

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

如何將MySQL Server升級(jí)到較新的版本? 如何將MySQL Server升級(jí)到較新的版本? 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

實(shí)施MySQL數(shù)據(jù)譜系跟蹤 實(shí)施MySQL數(shù)據(jù)譜系跟蹤 Aug 02, 2025 pm 12:37 PM

實(shí)現(xiàn)MySQL數(shù)據(jù)血緣追蹤的核心方法包括:1.利用Binlog記錄數(shù)據(jù)變更來源,開啟並解析binlog,結(jié)合應(yīng)用層上下文追溯具體業(yè)務(wù)動(dòng)作;2.在ETL流程中註入血緣標(biāo)籤,通過工具同步時(shí)記錄源與目標(biāo)的映射關(guān)係;3.給數(shù)據(jù)加註釋和元數(shù)據(jù)標(biāo)籤,在建表時(shí)說明字段來源,並接入元數(shù)據(jù)管理系統(tǒng)形成可視化圖譜;4.注意主鍵一致性、避免過度依賴SQL解析、版本控制數(shù)據(jù)模型變化及定期校驗(yàn)血緣數(shù)據(jù),確保血緣追蹤準(zhǔn)確可靠。

如何備份和還原MySQL數(shù)據(jù)庫? 如何備份和還原MySQL數(shù)據(jù)庫? Aug 02, 2025 am 11:15 AM

tobackupamysqldatabase,usemysqldumpwiththesyntaxmysqldump-u [username] -p [database_name]> backup_file.sql,whercreateSqlfile包含AllnnnnnnnnnnnnnnnnnneclyCommandStorecreateTheDatabase,andIncludeOptionslike-數(shù)據(jù)庫, - alldatabases,or-int-routinesaseed; al

See all articles