日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 查询语句_MySQL相关(一)- 一条查询语句是如何执行的

發布時間:2023/12/19 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 查询语句_MySQL相关(一)- 一条查询语句是如何执行的 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言


學習一個新知識最好的方式就是上官網,所以我先把官網貼出來 MySQL官網 (點擊查閱),如果大家有想了解我沒有說到的東西可以直接上官網看哈~目前 MySQL 最新大版本為8.0,但是鑒于目前應用比較多的還是 5.7,所以今天在這里還是針對 5.7 來做討論。
看了官網關于 MySQL 的介紹之后,我發現一個有趣的事情。在我身邊的同事,很多都是把 MySQL 讀錯了,當然,也是因為大家已經約定俗成了,所以我賣的關子是,MySQL 大家一般會都成 my sequel,但是在官網上讀法是這樣的[ My Ess Que Ell ],即把 s q l 分開來讀。當然這個不重要啦,這里只是跟大家嘮嗑一下哈哈~想驗證的伙伴可以點擊這個What is MySQL?


下面開始進入正題:
下面是 MySQL 的發展過程,目前的系統基本上都是分布式微服務的了,由于支持事務的特性,所以 innodb 為默認的存儲引擎,也是我們今天課程的主角。(MyISAM 和 Innodb 的區別在此不做贅述,想了解 MySQL 的引擎可至 MySQL 引擎鏈接查閱。


這里有一張腦圖,想要完整高清圖片可以到微信我的公眾號下【6曦軒】下回復 MySQL 腦圖獲取:


接下來我們會以這張腦圖的一些知識點展開來講,但是由于文章篇幅有限,有些點可能只會一筆帶過,有興趣的小伙伴可以到我的公眾號下與我留言討論。
我們今天的重點,在于將 MySQL 語句的執行流程給大家梳理一遍(如果文章哪里有疏漏的話,盡請大家批評指正)。

正文


一條查詢語句是如何執行的

查詢語句的執行分為以下幾步:

  • 查詢緩存
  • 解析器生成解析樹
  • 預處理再次生成解析樹
  • 查詢優化器
  • 查詢執行計劃
  • 查詢執行引擎
  • 查詢數據返回結果

  • 查詢緩存
    通過如下語句可查看緩存開關情況(默認關閉):show variables like 'query_cache%';

  • MySQL 拿到一個查詢請求后先會在查詢緩存中看看是否執行過此語句,之前執行的語句會以 key-value 的形式緩存在內存中,key 是緩存的語句,value 是查詢的結果
  • 如果命中緩存則直接將結果返回,如果沒有命中則繼續執行后面

  • 在 MySQL 中默認是關閉的,官方也建議關閉,將緩存交托給第三方如 redis 處理,為啥:

  • 查詢緩存的失效特表頻繁,對一個表的更新都會失效這個表所有的查詢緩存,對于更新頻繁的表命中率太低
  • MySQL 8.0 直接刪除查詢緩存

  • 解析器生成解析樹

  • 語法解析

  • 語法解析是解析你的語句是不是滿足 MySQL 語法標準,如果不對則會 :
    ERROR 1064 (42000): You have an error in your SQL syntax … 關于錯誤碼在官網有說明

  • 詞法解析

  • 關于解析完生成的解析樹類似下圖,我以’select name from user_info where sex=1 and age>20’為例:


    預處理再次生成解析樹
    語義解析,在語法及詞法解析完之后,進行預處理之后再次生成解析樹。
    查詢優化器
    在這一步將前面生成的解析樹優化成一個執行計劃。
    在這步做的事情主要有:

  • 選擇最合適的索引;
  • 選擇表掃還是走索引;
  • 選擇表關聯順序;
  • 優化 where 子句;
  • 排除管理中無用表;
  • 決定 order by 和 group by 是否走索引;
  • 嘗試使用 inner join 替換 outer join;
  • 簡化子查詢,決定結果緩存;
  • 合并試圖;

  • 順便提一下,optimizer_trace 優化器追蹤器,在 MySQL 中是默認關閉的(畢竟開啟也會消耗性能嘛對吧),可以使用 set 語句修改一下 optimizer_trace的開關,感受一下:set optimizer_trace='enabled=on '
    先查詢優化器追蹤的開關:show variables like 'optimizer_trace%';


    執行完一條語句之后執行下面語句查看優化器追蹤:select * from information_schema.optimizer_traceG
    可以看到一個 json 類型的字符串,主要是語句優化的三個階段,篇幅有限,這里不展開,對照著看應該可以看懂。


    查詢執行計劃
    查詢最后一次查詢的消耗,用以比較開銷:show status like 'Last_query_cost';
    在這一步選擇開銷最小的計劃執行
    查詢執行引擎
    這里執行器會先對權限做一個判斷,如果有權限,才會執行以下步驟,否則跑出權限異常:

  • 調用 Innodb 引擎接口獲取這個表的第一行,判斷ID是否為10,如果不是跳過,如果是則存在結果集中;
  • 引擎執行下一行,重復判斷相同的邏輯,直到最后一行;
  • 最后將滿足結果的結果集返回;
  • 對于有索引的表也差不多,第一次是調用滿足結果的第一行接口, 下來是查找滿足結果的下一行接口

  • 查詢數據返回結果
    將查詢數據的結果返回給查詢的客戶端,如果有緩存則返回緩存(前面已經說了默認關閉),可以說就大功告成了哈哈哈哈,真是曲折。
    總結
    經過上面一系列的梳理,相信大家對 MySQL 查詢語句的流程也有了一個大致的了解,下面是針對查詢語句的流程做的一張圖,方便大家記憶理解:


    By the way

    有問題?可以給我留言或私聊
    有收獲?那就順手點個贊唄~
    當然,也可以到我的公眾號下「6曦軒」,
    回復“學習”,即可領取一份【Java工程師進階架構師的視頻教程】~
    回復“面試”,可以獲得:【本人嘔心瀝血整理的 Java 面試題】
    回復“MySQL腦圖”,可以獲得【MySQL 知識點梳理高清腦圖】
    由于我咧,科班出身的程序員,php,Android以及硬件方面都做過,不過最后還是選擇專注于做 Java,所以有啥問題可以到公眾號提問討論(技術情感傾訴都可以哈哈哈),看到的話會盡快回復,希望可以跟大家共同學習進步,關于服務端架構,Java 核心知識解析,職業生涯,面試總結等文章會不定期堅持推送輸出,歡迎大家關注~~~

    http://weixin.qq.com/r/2kM-J4DEIN1frcRE9xbI (二維碼自動識別)

    總結

    以上是生活随笔為你收集整理的mysql 查询语句_MySQL相关(一)- 一条查询语句是如何执行的的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。