最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

MySQL基礎架構

先對MySQL的一些基礎組件進行簡單的介紹

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

MySQL主要分為server層和存儲引擎層。

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

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

SQL語句分析分為查詢語句和更新語句。

查詢語句

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

結合上面的說明,我們來結合這條查詢語句分析一下執(zhí)行過程:

先查詢該語句是否有權限,如果沒有權限直接報錯,如果有權限,在MySQL8.0版本前會查詢緩存,以這條SQL語句為key看是否命中緩存,命中直接返回緩存,沒有命中執(zhí)行下一步。

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

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

進行權限校驗,沒有權限直接返回錯誤信息,如果有權限就會調用數據庫引擎接口,返回引擎的執(zhí)行結果。

更新語句

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

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

先查詢出張三這一條數據,不會走查詢緩存,因為更新語句會導致與該表相關的查詢緩存失效。

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

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

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

主要原因如下:

功能不同:

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

恢復需求不同:

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

總結

只用redo log或binlog無法同時滿足以上的功能和恢復需求,所以要同時使用redo log和binlog。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • MySQL 升級方法指南大全

    MySQL 升級方法指南大全

    通常,從一個發(fā)布版本升級到另一個版本時,我們建議按照順序來升級版本。例如,想要升級 MySQL 3.23 時,先升級到 MySQL 4.0,而不是直接升級到 MySQL 4.1 或 MySQL 5.0。
    2008-01-01
  • 詳解MySQL下InnoDB引擎中的Memcached插件

    詳解MySQL下InnoDB引擎中的Memcached插件

    這篇文章主要介紹了詳解MySQL下InnoDB引擎中的Memcached插件,并且給出了實例演示,需要的朋友可以參考下
    2015-04-04
  • MySQL 8.0 之不可見列的基本操作

    MySQL 8.0 之不可見列的基本操作

    MySQL8.0.23之后引入了不可見列,今天我們來說說這個特性的基本使用,感興趣的朋友可以了解下
    2021-05-05
  • 數據庫工具sysbench安裝教程和性能測試例子

    數據庫工具sysbench安裝教程和性能測試例子

    這篇文章主要介紹了數據庫工具sysbench安裝教程和性能測試例子,sysbench的一個簡明入門教程,包含編譯安裝過程和主要測試數據,需要的朋友可以參考下
    2014-07-07
  • MySQL之FIND_IN_SET()的用法及說明

    MySQL之FIND_IN_SET()的用法及說明

    這篇文章主要介紹了MySQL之FIND_IN_SET()的用法及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • MySQL索引失效的原因及實現邏輯

    MySQL索引失效的原因及實現邏輯

    在MySQL中索引失效指的是查詢語句無法有效地使用索引,而必須進行全表掃描,索引失效可能會導致查詢性能下降,特別是在處理大量數據時,這篇文章主要介紹了MySQL索引失效的原因及實現邏輯,需要的朋友可以參考下
    2025-12-12
  • 詳解如何避免MYSQL主從延遲帶來的讀寫問題

    詳解如何避免MYSQL主從延遲帶來的讀寫問題

    當在主庫上進行更新后,有可能數據還沒來得及同步到從庫,但是這個時候又有讀數據的需求,為了能正確讀取出數據,這個時候就只有讀主庫了,所以本文給大家介紹了如何避免MYSQL主從延遲帶來的讀寫問題,需要的朋友可以參考下
    2024-03-03
  • MYSQL的索引使用注意小結

    MYSQL的索引使用注意小結

    這篇文章主要介紹了MYSQL的索引使用注意,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • 深入理解SQL的四種連接-左外連接、右外連接、內連接、全連接

    深入理解SQL的四種連接-左外連接、右外連接、內連接、全連接

    本篇文章是對SQL中的四種連接-左外連接、右外連接、內連接、全連接進行了詳細的分析介紹,需要的朋友參考下
    2013-07-07
  • Mysql基礎入門 輕松學習Mysql命令

    Mysql基礎入門 輕松學習Mysql命令

    這篇文章主要是Mysql基礎入門教程,教大家如何輕松學習Mysql命令,并熟練掌握Mysql命令,感興趣的小伙伴們可以參考一下
    2015-11-11

最新評論

东至县| 金寨县| 德安县| 绥阳县| 延安市| 韶山市| 平安县| 谢通门县| 禹城市| 金湖县| 思茅市| 尤溪县| 怀仁县| 南溪县| 论坛| 仪陇县| 陆川县| 特克斯县| 高州市| 赣榆县| 宿迁市| 宝清县| 贵南县| 永福县| 始兴县| 宁海县| 昭通市| 田林县| 旅游| 新绛县| 南丰县| 惠来县| 贵定县| 北碚区| 中方县| 长子县| 晋城| 新竹县| 双江| 旬邑县| 明溪县|