在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

查詢SQL在mysql內部是如何執(zhí)行?

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

前言

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

select*fromtest_db.user_info_tabwhereuser_id=123;

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

MySQL 基本架構

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

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

Server 層

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

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

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

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

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

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

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

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

連接器

我們要執(zhí)行查詢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)

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

查詢緩存

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

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

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

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

分析器

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

你扔個SQL給MySQL服務器,它肯定需要先解析,才知道這個SQL是做什么的,對吧。它會派出分析器,先做詞法分析。你提交過來的查詢SQL是由很多個字符創(chuàng)和空格組成的,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。

優(yōu)化器

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

比如這個查詢SQL:

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

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

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

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

經過優(yōu)化器之后,就來到了執(zhí)行器階段。也就是真正執(zhí)行查詢SQL了。

執(zhí)行器

select*fromtest_db.user_info_tabwhereuser_id=123;

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

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

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

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

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

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

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

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

審核編輯:黃飛

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

    關注

    1

    文章

    764

    瀏覽量

    44130
  • Server
    +關注

    關注

    0

    文章

    90

    瀏覽量

    24037
  • MySQL
    +關注

    關注

    1

    文章

    809

    瀏覽量

    26569

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

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

收藏 人收藏

    評論

    相關推薦

    MySQL執(zhí)行過程 SQL語句性能優(yōu)化常用策略

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

    DRDS分布式SQL引擎—執(zhí)行計劃介紹

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

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

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

    Linux系統下執(zhí)行MySQLSQL文件程序免費下載

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

    MySQL查詢幫助的使用

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

    一條SQL語句是怎么被執(zhí)行

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

    簡述SQL更新語句的執(zhí)行流程1

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

    簡述SQL更新語句的執(zhí)行流程2

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

    一文終結SQL查詢優(yōu)化

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

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

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

    MySQL內部如何工作的?

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

    mysqlsql server區(qū)別

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

    sql where條件的執(zhí)行順序

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

    oracle執(zhí)行sql查詢語句的步驟是什么

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

    MySQL執(zhí)行過程:如何進行sql 優(yōu)化

    (1)客戶端發(fā)送一條查詢語句到服務器; (2)服務器先查詢緩存,如果命中緩存,則立即返回存儲緩存中的數據; (3)未命中緩存后,MySQL 通過關鍵字將
    的頭像 發(fā)表于 12-12 10:19 ?410次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>執(zhí)行</b>過程:如何進行<b class='flag-5'>sql</b> 優(yōu)化
    主站蜘蛛池模板: 国产成人综合一区人人| 亚洲欧美国产五月天综合| 天天添天天射| 狠狠干人人干| 五月婷婷婷婷| 国产伦子系列视频6| 狠狠操狠狠干| aaa亚洲| 免费的日本网站| 天堂网中文| 轻点灬大ji巴太粗太长了啊h | 午夜小视频在线播放| 91精品福利久久久| 下农村女人一级毛片| 国产va免费精品高清在线| 91久久人澡人人添人人爽| 亚洲国产成人久久精品图片| 国产日韩精品欧美一区色| 国产大片91精品免费观看不卡| 综合色99| 福利色播| 91大神在线观看视频| 日本免费成人| 日日天天夜夜| 在线黄色免费| 成人国产在线24小时播放视频| 2021国产成人精品久久| 四虎影院免费观看| 五月天婷婷亚洲| 免费亚洲视频在线观看| 久久澡人人澡狠狠澡| 国产福利小视频在线观看| 四虎影院网址大全| 我爱操| 一级女性黄 色生活片| 成人国产日本亚洲精品| 一区二区中文字幕| 狠狠色丁香久久综合网| 欧美xx网站| 美女被猛男躁免费视频网站| 俄罗斯小屁孩cao大人免费|