亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SQL語(yǔ)句在MySQL的執(zhí)行過(guò)程詳解

 更新時(shí)間:2025年05月26日 09:41:47   作者:理想奮斗中  
這篇文章主要介紹了SQL語(yǔ)句在MySQL的執(zhí)行過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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

先對(duì)MySQL的一些基礎(chǔ)組件進(jìn)行簡(jiǎn)單的介紹

  • 1.連接器:身份認(rèn)證和權(quán)限相關(guān)。
  • 2.查詢緩存:執(zhí)行查詢語(yǔ)句時(shí),會(huì)先查詢緩存(MySQL8.0版本后移除)。
  • 3.分析器:詞法分析和語(yǔ)法分析,詞法分析即對(duì)一條SQL語(yǔ)句中的關(guān)鍵字進(jìn)行提取,如select、insert、update、表名、字段名等等,語(yǔ)法分析即查看SQL語(yǔ)句是否有語(yǔ)法錯(cuò)誤。
  • 4.優(yōu)化器:根據(jù)MySQL內(nèi)部的優(yōu)化算法按照最優(yōu)方案執(zhí)行SQL。
  • 5.執(zhí)行器:執(zhí)行語(yǔ)句,然后從存儲(chǔ)引擎返回?cái)?shù)據(jù)。

MySQL主要分為server層和存儲(chǔ)引擎層。

  • server層:包含連接器、查詢緩存、分析器、優(yōu)化器、執(zhí)行器等,所有跨存儲(chǔ)引擎的功能都在這一層實(shí)現(xiàn),比如存儲(chǔ)過(guò)程、觸發(fā)器、視圖、函數(shù)等等,還有一個(gè)MySQL通用日志binlog日志模塊。
  • 存儲(chǔ)引擎層:主要負(fù)責(zé)數(shù)據(jù)的讀取和存儲(chǔ)采用可以替換的插件式架構(gòu),支持InnoDB、MyISAM、Memory等存儲(chǔ)引擎,其中InnoDB引擎有自帶的日志模塊redo log,現(xiàn)在最常用的存儲(chǔ)引擎是InnoDB,從MySQL5.5之后就是MySQL的默認(rèn)引擎。

說(shuō)了這么多,那么SQL語(yǔ)句到底在MySQL中是怎么執(zhí)行的呢?

SQL語(yǔ)句分析分為查詢語(yǔ)句和更新語(yǔ)句。

查詢語(yǔ)句

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

結(jié)合上面的說(shuō)明,我們來(lái)結(jié)合這條查詢語(yǔ)句分析一下執(zhí)行過(guò)程:

先查詢?cè)撜Z(yǔ)句是否有權(quán)限,如果沒(méi)有權(quán)限直接報(bào)錯(cuò),如果有權(quán)限,在MySQL8.0版本前會(huì)查詢緩存,以這條SQL語(yǔ)句為key看是否命中緩存,命中直接返回緩存,沒(méi)有命中執(zhí)行下一步。

通過(guò)分析器提取該SQL語(yǔ)句中的關(guān)鍵字,如select、from、表名tb_student、查詢的列、等等,然后判斷這個(gè)SQL語(yǔ)句是否有錯(cuò)誤,比如關(guān)鍵字是否拼寫錯(cuò)誤,沒(méi)有錯(cuò)誤執(zhí)行下一步。

接下來(lái)就是優(yōu)化器確定執(zhí)行方案,上面SQL語(yǔ)句有兩種執(zhí)行方案,a先查詢年齡為18,然后查詢name為張三的數(shù)據(jù),b先查詢name為張三,然后查詢age為18的數(shù)據(jù),優(yōu)化器會(huì)根據(jù)內(nèi)部的優(yōu)化算法進(jìn)行選擇執(zhí)行效率最高的一個(gè)方案,確定執(zhí)行計(jì)劃后開始執(zhí)行語(yǔ)句。

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

更新語(yǔ)句

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

執(zhí)行更新語(yǔ)句不同的是要進(jìn)行日志記錄了,這時(shí)候就要引進(jìn)日志模塊了,MySQL自帶的日志是binlog日志,所有存儲(chǔ)引擎都可以使用,InnoDB引擎有redo log日志,我們就以InnoDB引擎來(lái)分析一下這條更新語(yǔ)句的執(zhí)行過(guò)程:

先查詢出張三這一條數(shù)據(jù),不會(huì)走查詢緩存,因?yàn)楦抡Z(yǔ)句會(huì)導(dǎo)致與該表相關(guān)的查詢緩存失效。

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

執(zhí)行器接收通知后,記錄binlog,并提交reod log。

肯定有人疑惑,這里為什么要用兩個(gè)日志記錄,不能用一個(gè)日志記錄嗎?

主要原因如下:

功能不同:

  • redo log是InnoDB特有的日志,用于保證事務(wù)的持久性。在數(shù)據(jù)庫(kù)發(fā)生崩潰時(shí),通過(guò)redo log可以將未持久化到磁盤的數(shù)據(jù)頁(yè)恢復(fù)到內(nèi)存,從而實(shí)現(xiàn)事務(wù)的持久化。
  • binlog是MySQL server層的日志,主要用于記錄數(shù)據(jù)庫(kù)所有的變更操作,用于數(shù)據(jù)恢復(fù)、主從復(fù)制等。

恢復(fù)需求不同:

  • redo log在數(shù)據(jù)庫(kù)崩潰時(shí),能讓數(shù)據(jù)庫(kù)恢復(fù)到崩潰前的一致狀態(tài),確保已提交的事務(wù)不會(huì)丟失。
  • binlog:binlog日志主要進(jìn)行從某個(gè)位置或某個(gè)時(shí)間點(diǎn)恢復(fù)到另一個(gè)位置和時(shí)間點(diǎn)的恢復(fù)。

總結(jié)

只用redo log或binlog無(wú)法同時(shí)滿足以上的功能和恢復(fù)需求,所以要同時(shí)使用redo log和binlog。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mysql性能優(yōu)化方案分享

    Mysql性能優(yōu)化方案分享

    這篇文章主要為大家分享了Mysql性能優(yōu)化方案,幫助大家進(jìn)行Mysql性能優(yōu)化,感興趣的小伙伴們可以參考一下
    2016-03-03
  • mysql sql99語(yǔ)法 內(nèi)連接非等值連接詳解

    mysql sql99語(yǔ)法 內(nèi)連接非等值連接詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于mysql sql99語(yǔ)法 內(nèi)連接非等值連接的相關(guān)知識(shí)點(diǎn)文章,有需要的朋友們可以學(xué)習(xí)下。
    2019-09-09
  • MYSQL主庫(kù)切換binlog模式后主從同步錯(cuò)誤的解決方案

    MYSQL主庫(kù)切換binlog模式后主從同步錯(cuò)誤的解決方案

    在使用FlinkSQL的mysql-cdc連接器來(lái)監(jiān)聽MySQL數(shù)據(jù)庫(kù)時(shí),通常需要將MySQL的binlog模式設(shè)置為ROW模式,當(dāng)我們將MySQL主庫(kù)的binlog模式從STATEMENT切換為ROW并重啟MySQL服務(wù)后,MySQL從庫(kù)在同步時(shí)可能會(huì)報(bào)錯(cuò),所以本文介紹了MYSQL主庫(kù)切換binlog模式后主從同步錯(cuò)誤的解決方案
    2024-08-08
  • mysql 超大數(shù)據(jù)/表管理技巧

    mysql 超大數(shù)據(jù)/表管理技巧

    在實(shí)際應(yīng)用中經(jīng)過(guò)存儲(chǔ)、優(yōu)化可以做到在超過(guò)9千萬(wàn)數(shù)據(jù)中的查詢響應(yīng)速度控制在1到20毫秒??瓷先ナ莻€(gè)不錯(cuò)的成績(jī),不過(guò)優(yōu)化這條路沒(méi)有終點(diǎn),當(dāng)我們的系統(tǒng)有超過(guò)幾百人、上千人同時(shí)使用時(shí),仍然會(huì)顯的力不從心
    2013-03-03
  • 關(guān)于Mysql插入中文字符報(bào)錯(cuò)ERROR 1366(HY000)的解決方法

    關(guān)于Mysql插入中文字符報(bào)錯(cuò)ERROR 1366(HY000)的解決方法

    這篇文章主要介紹了關(guān)于Mysql插入中文字符報(bào)錯(cuò)ERROR 1366(HY000)的解決方法,在我們?nèi)粘J褂胢ysql的過(guò)程中會(huì)經(jīng)常遇到各種報(bào)錯(cuò),今天我們就來(lái)看一下ERROR 1366報(bào)錯(cuò)的解決方法吧
    2023-07-07
  • Mysql基礎(chǔ)學(xué)習(xí)之LAG與LEAD開窗函數(shù)

    Mysql基礎(chǔ)學(xué)習(xí)之LAG與LEAD開窗函數(shù)

    lead和lag是在SQL中用于創(chuàng)建窗口函數(shù)的兩個(gè)常用函數(shù),這篇文章主要給大家介紹了關(guān)于Mysql基礎(chǔ)學(xué)習(xí)之LAG與LEAD開窗函數(shù)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Mysql以u(píng)tf8存儲(chǔ)gbk輸出的實(shí)現(xiàn)方法提供

    Mysql以u(píng)tf8存儲(chǔ)gbk輸出的實(shí)現(xiàn)方法提供

    Mysql以u(píng)tf8存儲(chǔ)gbk輸出的實(shí)現(xiàn)方法提供...
    2007-11-11
  • MySQL數(shù)據(jù)操作管理示例詳解

    MySQL數(shù)據(jù)操作管理示例詳解

    MySQL是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),在WEB應(yīng)用方面MySQL是最好的應(yīng)用軟件之一。在本篇中,會(huì)讓大家快速掌握MySQL的基本操作,并輕松使用MySQL數(shù)據(jù)庫(kù)
    2022-09-09
  • mysql 5.7.21解壓版安裝配置方法圖文教程(win10)

    mysql 5.7.21解壓版安裝配置方法圖文教程(win10)

    這篇文章主要為大家詳細(xì)介紹了win10下mysql 5.7.21解壓版安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • mysql如何變更自增主鍵id起始值

    mysql如何變更自增主鍵id起始值

    這篇文章主要介紹了mysql如何變更自增主鍵id起始值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評(píng)論