色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

查詢SQL在mysql內部是如何執行?

數據分析與開發 ? 來源:數據分析與開發 ? 2024-01-22 14:53 ? 次閱讀

前言

日常開發中,我們經常需要寫查詢SQL。但是,大家知道一條查詢SQL在mysql內部是如何執行的嘛?比如這條簡單的SQL:

select*fromtest_db.user_info_tabwhereuser_id=123;

我們知道在mySQL客戶端,輸入一條查詢SQL,然后看到返回查詢的結果。這條查詢語句在 MySQL 內部到底是如何執行的呢?本文跟大家探討一下哈,我們先來看下MySQL基本架構~

MySQL 基本架構

db078aa8-b8eb-11ee-8b88-92fbcf53809c.png

總體來說,MySQL大體分為兩部分,分別是Server 層和存儲引擎層

Server 層

它包括連接器、查詢緩存、分析器、優化器、執行器等。比如存儲過程,觸發器,視圖都是在這一層實現的。

連接器(Connection Manager):負責處理客戶端與服務器之間的連接。它接受來自客戶端的請求,并進行身份驗證和權限檢查,建立和管理連接。

查詢緩存(Query Cache):在舊版 MySQL 中有,但在較新的版本中已不推薦使用。它能夠緩存查詢和對應的結果,以提高查詢性能。然而,在高并發和大型數據庫中,它反而可能成為性能瓶頸,因為它在某些情況下會引起鎖和不必要的開銷。

分析器(Parser):負責分析 SQL 查詢語句,驗證其語法和語義,確保查詢的正確性。它將 SQL 語句轉換成內部數據結構供優化器和執行器使用。

優化器(Optimizer):接收來自分析器的查詢請求,并決定如何最有效地執行查詢。優化器的目標是找到最佳的執行路徑,選擇合適的索引、連接順序和訪問方法,以提高查詢性能。

執行器(Executor):負責執行優化器生成的執行計劃,獲取存儲引擎返回的數據,并處理客戶端請求。它與存儲引擎交互,執行查詢并返回結果給用戶。

存儲引擎層: 它負責數據的存儲和提取。Mysql支持InnoDB、MyISAM、Memory 等多個存儲引擎。我們日常開發中,一般用的存儲引擎就是InnoDB。從 MySQL 5.5 版本開始,InnoDB 就成為了默認的存儲引擎。

介紹完MySQL基本架構,帶大家看一下,每個組件,一條查詢SQL主要做什么事~~

連接器

我們要執行查詢SQL,一般在MySQL客戶端, 需要輸入連接命令,連接到MySQL服務端。在MySQL服務端,就是連接器負責跟你的客戶端建立連接、獲取權限、維持和管理連接

連接命令如下:

mysql-h(ip地址)-P(端口)-u(用戶名)-p

輸入完連接命令之后,我們接著輸入正確的密碼,經過經典的TCP握手之后,就可以成功連接到MySQL服務器啦,如下:

C:MySQLMySQLServer8.0in>mysql-h127.0.0.1-P3306-uroot-p
Enterpassword:******
WelcometotheMySQLmonitor.Commandsendwith;org.
YourMySQLconnectionidis50
Serverversion:8.0.31MySQLCommunityServer-GPL

Copyright(c)2000,2022,Oracleand/oritsaffiliates.

OracleisaregisteredtrademarkofOracleCorporationand/orits
affiliates.Othernamesmaybetrademarksoftheirrespective
owners.

Type'help;'or'h'forhelp.Type'c'toclearthecurrentinputstatement.

mysql>

如果輸入密碼錯誤,則會收到一個 Access denied的錯誤信息,如下:

C:ProgramFilesMySQLMySQLServer8.0in>mysql-h127.0.0.1-P3306-uroot-p
Enterpassword:*****
ERROR1045(28000):Accessdeniedforuser'root'@'localhost'(usingpassword:YES)

連接成功之后,大家就可以直接輸入查詢SQL,就可以看到結果啦。

mysql>select*fromtest_db.user_info_tabwhereuser_id=123;
+---------+----------------+------+------+--------+---------+--------------------------+
|id|user_name|age|city|status|user_id|password|
+---------+----------------+------+------+--------+---------+--------------------------+
|1570091|撿田螺的小男孩|28|深圳|活躍|123|523da7ne+yndc5nb1zWWlA==|
+---------+----------------+------+------+--------+---------+--------------------------+
1rowinset(0.01sec)

大家注意一下哈,如果連接成功后,沒有后續的輸入查詢SQL等其他操作。這時候,這個連接是空閑的哈,可以用show processlist查看。

查詢緩存

老版本的MySQL中,連接成功后,我們執行查詢SQL,會先執行查詢緩存

也就是說MySQL接受到一個查詢SQL請求時,會先去查詢緩存看看,如果緩存有這條SQL的查詢結果,會直接返回。如果查詢緩存沒有,就繼續往下執行,執行完之后,把結果寫入緩存。其中,這個查詢緩存是key-value的結果,你可以把它理解為一個map吧,其中key就是這個查詢SQL,value則是這個查詢的結果。

同時,如果你查詢的表進行更新的時候,會清空緩存的。一個表更新比較頻繁的話,使用查詢緩存命中率會很低,你剛查完放到緩存,更新SQL又清空了,就很不劃算。有些時候,一些靜態配置表,很少更新的,才建議使用查詢緩存。其他更新頻繁的表,則不建議使用查詢緩存,你可以通過這個參數query_cache_type 設值是否走查詢緩存。

其實,MySQL 比較新的版本,如8.0 已經廢棄了查詢緩存,并且相應的參數 query_cache_type 也不再存在。因為在高并發和大型數據庫環境下,查詢緩存可能導致性能問題,并且在實際測試中發現,禁用查詢緩存可能會提高整體性能和可伸縮性。

分析器

如果查詢SQL沒有命中查詢緩存的話,繼續往下執行,就到分析器上場了。它負責分析 SQL 查詢語句,驗證其語法和語義,確保查詢的正確性

你扔個SQL給MySQL服務器,它肯定需要先解析,才知道這個SQL是做什么的,對吧。它會派出分析器,先做詞法分析。你提交過來的查詢SQL是由很多個字符創和空格組成的,MySQL會先解析出這些字符串表示什么意思。

select*fromtest_db.user_info_tabwhereuser_id=123;

它先把關鍵字select解析出來,然后把user_info_tab解析成表,user_id解析成列名。做完詞法分析之后,開始做語法分析。語法分析主要就是判斷,你的SQL是否滿足MYSQL的語法。

如果你的SQL寫錯了,語法分析就會報錯誤提示: ERROR 1064 (42000): You have an error in your SQL syntax;

mysql>select*romtest_db.user_info_tabwhereuser_id=123;
ERROR1064(42000):YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'romtest_db.user_info_tabwhereuser_id=123'atline1

平時大家看到這個錯誤的時候,只需要,關注關鍵詞 syntax to use near 就可以快速知道哪里寫錯啦。比如這個例子,就是我的from寫錯了,少了f。

優化器

經過分析器之后,MySQL已經知道需要做什么了。但是在經過執行器之前,還會先經過優化器。優化器做的事情就是,怎么去做才是最好的。對于一條查詢SQL來說就是:怎么去查是最佳效率的。

比如這個查詢SQL:

select*fromtest_db.user_info_tabwhereuser_id=123anduser_name='田螺';

其中,在user_info_tab表中,user_id為索引字段,user_name也是索引字段。

這條SQL執行的時候,可能使用索引user_id,也可能使用使用user_name。選擇不同的索引,執行效率是不一樣的。具體怎么選擇,就是優化器所做的事情。

大家是否還記得explain。我們使用它加在我們查詢的SQL,就可以幫助了解優化器在執行查詢時,選擇的執行計劃和相應的優化策略。

經過優化器之后,就來到了執行器階段。也就是真正執行查詢SQL了。

執行器

select*fromtest_db.user_info_tabwhereuser_id=123;

在要開始執行時候,會判斷一下,該用戶是否對這個SQL有查詢的權限,如果沒有,則會報權限錯誤。如果有權限的時候,打開表直接執行。執行的過程,其實類似于執行調用引擎提供的接口

我們現在假設user_id不是索引字段,我們使用的是InnoDb存儲引擎,這個查詢SQL執行過程就是這樣:

調用InnoDb存儲引擎提供的接口,獲取user_info_tab表的第一行

判斷user_id是不是為123,如果不是,跳過這一行。如果是,把這一行放到結果集。

調用InnoDb存儲引擎提供的接口,獲取user_info_tab表的下一行

判斷user_id是不是為123,如果不是,跳過這一行。如果是,把這一行放到結果集。

重復3、4步驟,一直掃描完user_info_tab表的所有行。最后把結果集返回客戶端。

聊到這里,其實一條查詢SQL的執行過程,已經講完啦,是不是很簡單呀~~

審核編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SQL
    SQL
    +關注

    關注

    1

    文章

    773

    瀏覽量

    44213
  • Server
    +關注

    關注

    0

    文章

    93

    瀏覽量

    24075
  • MySQL
    +關注

    關注

    1

    文章

    829

    瀏覽量

    26674

原文標題:一條查詢SQL是如何執行的

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    MySQL執行過程 SQL語句性能優化常用策略

    回顧 MySQL執行過程,幫助介紹如何進行 sql 優化。
    的頭像 發表于 12-12 10:26 ?699次閱讀
    <b class='flag-5'>MySQL</b>的<b class='flag-5'>執行</b>過程 <b class='flag-5'>SQL</b>語句性能優化常用策略

    DRDS分布式SQL引擎—執行計劃介紹

    摘要: 本文著重介紹 DRDS 執行計劃中各個操作符的含義,以便用戶通過查詢計劃了解 SQL 執行流程,從而有針對性的調優 SQL。DRDS
    發表于 07-12 17:01

    SQL語句怎么搞定跨實例查詢

    這個SQL的語法完全兼容MySQL,只是From的表名前面帶上DBLink。所以,業務方只需要使用DMS跨數據庫查詢SQL便可輕松解決拆庫
    發表于 11-03 10:22 ?5790次閱讀

    Linux系統下執行MySQLSQL文件程序免費下載

    本文檔的主要內容詳細介紹的是Linux系統下執行MySQLSQL文件程序免費下載。
    發表于 11-01 17:29 ?4次下載

    MySQL查詢幫助的使用

    使用MySQL過程中,當遇到操作語法、數據類型的取值范圍、功能是否支持等問題時,可以使用MySQL自帶的幫助文檔查詢
    的頭像 發表于 04-16 17:14 ?1697次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>查詢</b>幫助的使用

    一條SQL語句是怎么被執行

    一直是想知道一條SQL語句是怎么被執行的,它執行的順序是怎樣的,然后查看總結各方資料,就有了下面這一篇博文了。 本文將從MySQL總體架構---》
    的頭像 發表于 09-12 09:44 ?1532次閱讀
    一條<b class='flag-5'>SQL</b>語句是怎么被<b class='flag-5'>執行</b>的

    簡述SQL更新語句的執行流程1

    之前我們講過了一條SQL查詢語句是如何執行的,那么插入(INSERT)、更新(UPDATE)和刪除(DELETE)操作的流程又是什么樣子呢? 其實對于MySQL而言,只有兩種通常
    的頭像 發表于 02-14 15:40 ?641次閱讀
    簡述<b class='flag-5'>SQL</b>更新語句的<b class='flag-5'>執行</b>流程1

    簡述SQL更新語句的執行流程2

    之前我們講過了一條SQL查詢語句是如何執行的,那么插入(INSERT)、更新(UPDATE)和刪除(DELETE)操作的流程又是什么樣子呢? 其實對于MySQL而言,只有兩種通常
    的頭像 發表于 02-14 15:40 ?563次閱讀
    簡述<b class='flag-5'>SQL</b>更新語句的<b class='flag-5'>執行</b>流程2

    一文終結SQL查詢優化

    查詢(Subquery)的優化一直以來都是 SQL 查詢優化中的難點之一。關聯子查詢的基本執行方式類似于 Nested-Loop,但是這種
    的頭像 發表于 04-28 14:19 ?790次閱讀
    一文終結<b class='flag-5'>SQL</b>子<b class='flag-5'>查詢</b>優化

    恒訊科技分析:MySQLSQL有什么區別?(優點和缺點)

    SQLMySQL是工業數據管理和數據庫管理系統領域中兩個經常使用的術語。本教程中,小編將與大家一起討論MySQLSQL有什么區別? 一
    的頭像 發表于 05-29 17:14 ?984次閱讀

    MySQL內部如何工作的?

    MySQL是一個開源的、Oracle支持的基于結構化查詢語言(SQL)的關系數據庫管理系統(RDBMS)。它可以在所有主要平臺上運行,包括Windows、Linux和UNIX。盡管MySQL
    的頭像 發表于 06-30 17:03 ?573次閱讀

    mysqlsql server區別

    MySQLSQL Server是兩種常見的關系型數據庫管理系統(RDBMS),用于存儲和管理數據庫。雖然它們都支持SQL語言,但在其他方面存在一些顯著的區別。以下是MySQL
    的頭像 發表于 11-21 11:07 ?1575次閱讀

    sql where條件的執行順序

    深入討論WHERE條件的執行順序之前,先回顧一下一般SQL語句的執行順序。一條SQL語句的執行
    的頭像 發表于 11-23 11:31 ?2270次閱讀

    oracle執行sql查詢語句的步驟是什么

    。以下是對每個步驟的詳盡、詳實、細致的解釋。 編寫SQL語句: SQL(結構化查詢語言)是一種用于與數據庫進行通信的標準語言。使用Oracle執行
    的頭像 發表于 12-06 10:49 ?1021次閱讀

    MySQL執行過程:如何進行sql 優化

    (1)客戶端發送一條查詢語句到服務器; (2)服務器先查詢緩存,如果命中緩存,則立即返回存儲緩存中的數據; (3)未命中緩存后,MySQL 通過關鍵字將
    的頭像 發表于 12-12 10:19 ?437次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>執行</b>過程:如何進行<b class='flag-5'>sql</b> 優化
    主站蜘蛛池模板: 亚洲欧美自拍清纯中文字幕 | 国产婷婷午夜精品无码A片 国产婷婷色综合AV蜜臀AV | 久久视频这里只精品99热在线观看 | 人与人特黄一级 | 久草精品在线 | 国产精品久久久久久搜索 | 国产精品色吧国产精品 | 麻豆高清区在线 | 禁漫H天堂免费A漫 | 精品AV亚洲乱码一区二区 | 日本阿v片在线播放免费 | 日本bbwhd | 女教师苍井空体肉女教师S242 | a级全黄试频试看30分钟 | 久久久GOGO无码啪啪艺术 | 美女坐脸vk | 好姑娘社区在线视频 | 超碰免费视频caoporn | 精品午夜中文字幕熟女人妻在线 | 国产高清视频在线观看97 | 乱码午夜-极品国产内射 | 老外的好大c的我好爽 | 亚洲一卡二卡三卡四卡2021麻豆 | 草草久久久无码国产专区全集观看 | 丰满的女朋友 在线播放 | 5278欧美一区二区三区 | 国产午夜精品片一区二区三区 | 中国农村妇女真实BBWBBWBBW | 52色擼99热99| 麻豆沈芯语 | 国产美女视频一区二区二三区 | 一本道色播 | 耽美肉文 高h失禁 | 国产日韩成人内射视频 | 恋孩癖网站大全在线观看 | av先锋影音资源男人站 | 色综合伊人色综合网站中国 | 色多多深夜福利免费观看 | 狠狠色在在线视频观看 | 北岛玲手机在线观看视频观看 | 国产亚洲美女在线视频视频 |