mysql 查询语句_MySQL相关(一)- 一条查询语句是如何执行的
前言
學(xué)習(xí)一個新知識最好的方式就是上官網(wǎng),所以我先把官網(wǎng)貼出來 MySQL官網(wǎng) (點擊查閱),如果大家有想了解我沒有說到的東西可以直接上官網(wǎng)看哈~目前 MySQL 最新大版本為8.0,但是鑒于目前應(yīng)用比較多的還是 5.7,所以今天在這里還是針對 5.7 來做討論。
看了官網(wǎng)關(guān)于 MySQL 的介紹之后,我發(fā)現(xiàn)一個有趣的事情。在我身邊的同事,很多都是把 MySQL 讀錯了,當(dāng)然,也是因為大家已經(jīng)約定俗成了,所以我賣的關(guān)子是,MySQL 大家一般會都成 my sequel,但是在官網(wǎng)上讀法是這樣的[ My Ess Que Ell ],即把 s q l 分開來讀。當(dāng)然這個不重要啦,這里只是跟大家嘮嗑一下哈哈~想驗證的伙伴可以點擊這個What is MySQL?
下面開始進入正題:
下面是 MySQL 的發(fā)展過程,目前的系統(tǒng)基本上都是分布式微服務(wù)的了,由于支持事務(wù)的特性,所以 innodb 為默認的存儲引擎,也是我們今天課程的主角。(MyISAM 和 Innodb 的區(qū)別在此不做贅述,想了解 MySQL 的引擎可至 MySQL 引擎鏈接查閱。
這里有一張腦圖,想要完整高清圖片可以到微信我的公眾號下【6曦軒】下回復(fù) MySQL 腦圖獲取:
接下來我們會以這張腦圖的一些知識點展開來講,但是由于文章篇幅有限,有些點可能只會一筆帶過,有興趣的小伙伴可以到我的公眾號下與我留言討論。
我們今天的重點,在于將 MySQL 語句的執(zhí)行流程給大家梳理一遍(如果文章哪里有疏漏的話,盡請大家批評指正)。
正文
一條查詢語句是如何執(zhí)行的
查詢語句的執(zhí)行分為以下幾步:
查詢緩存
通過如下語句可查看緩存開關(guān)情況(默認關(guān)閉):show variables like 'query_cache%';
在 MySQL 中默認是關(guān)閉的,官方也建議關(guān)閉,將緩存交托給第三方如 redis 處理,為啥:
解析器生成解析樹
語法解析是解析你的語句是不是滿足 MySQL 語法標準,如果不對則會 :
ERROR 1064 (42000): You have an error in your SQL syntax … 關(guān)于錯誤碼在官網(wǎng)有說明
關(guān)于解析完生成的解析樹類似下圖,我以’select name from user_info where sex=1 and age>20’為例:
預(yù)處理再次生成解析樹
語義解析,在語法及詞法解析完之后,進行預(yù)處理之后再次生成解析樹。
查詢優(yōu)化器
在這一步將前面生成的解析樹優(yōu)化成一個執(zhí)行計劃。
在這步做的事情主要有:
順便提一下,optimizer_trace 優(yōu)化器追蹤器,在 MySQL 中是默認關(guān)閉的(畢竟開啟也會消耗性能嘛對吧),可以使用 set 語句修改一下 optimizer_trace的開關(guān),感受一下:set optimizer_trace='enabled=on '
先查詢優(yōu)化器追蹤的開關(guān):show variables like 'optimizer_trace%';
執(zhí)行完一條語句之后執(zhí)行下面語句查看優(yōu)化器追蹤:select * from information_schema.optimizer_traceG
可以看到一個 json 類型的字符串,主要是語句優(yōu)化的三個階段,篇幅有限,這里不展開,對照著看應(yīng)該可以看懂。
查詢執(zhí)行計劃
查詢最后一次查詢的消耗,用以比較開銷:show status like 'Last_query_cost';
在這一步選擇開銷最小的計劃執(zhí)行
查詢執(zhí)行引擎
這里執(zhí)行器會先對權(quán)限做一個判斷,如果有權(quán)限,才會執(zhí)行以下步驟,否則跑出權(quán)限異常:
查詢數(shù)據(jù)返回結(jié)果
將查詢數(shù)據(jù)的結(jié)果返回給查詢的客戶端,如果有緩存則返回緩存(前面已經(jīng)說了默認關(guān)閉),可以說就大功告成了哈哈哈哈,真是曲折。
總結(jié)
經(jīng)過上面一系列的梳理,相信大家對 MySQL 查詢語句的流程也有了一個大致的了解,下面是針對查詢語句的流程做的一張圖,方便大家記憶理解:
By the way
有問題?可以給我留言或私聊
有收獲?那就順手點個贊唄~
當(dāng)然,也可以到我的公眾號下「6曦軒」,
回復(fù)“學(xué)習(xí)”,即可領(lǐng)取一份【Java工程師進階架構(gòu)師的視頻教程】~
回復(fù)“面試”,可以獲得:【本人嘔心瀝血整理的 Java 面試題】
回復(fù)“MySQL腦圖”,可以獲得【MySQL 知識點梳理高清腦圖】
由于我咧,科班出身的程序員,php,Android以及硬件方面都做過,不過最后還是選擇專注于做 Java,所以有啥問題可以到公眾號提問討論(技術(shù)情感傾訴都可以哈哈哈),看到的話會盡快回復(fù),希望可以跟大家共同學(xué)習(xí)進步,關(guān)于服務(wù)端架構(gòu),Java 核心知識解析,職業(yè)生涯,面試總結(jié)等文章會不定期堅持推送輸出,歡迎大家關(guān)注~~~
http://weixin.qq.com/r/2kM-J4DEIN1frcRE9xbI (二維碼自動識別)
總結(jié)
以上是生活随笔為你收集整理的mysql 查询语句_MySQL相关(一)- 一条查询语句是如何执行的的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快手怎么看出来被屏蔽(快手短视频App快
- 下一篇: sql server 2008 年累计数