亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

MySql基礎(chǔ)架構(gòu)以及SQL語句執(zhí)行流程

 

01. MySQL基礎(chǔ)架構(gòu)

SQL語句是如何執(zhí)行的

學(xué)習(xí)一下mysql的基礎(chǔ)架構(gòu),從一條sql語句是如何執(zhí)行的來學(xué)習(xí)。

一般我們寫一條查詢語句類似下面這樣:

select user,password from mysql.user;

這樣就可以返回一個結(jié)果,但卻不知這條語句的內(nèi)部執(zhí)行流程。

如下是mysql的邏輯架構(gòu)圖:

MySql基礎(chǔ)架構(gòu)以及SQL語句執(zhí)行流程

 

Mysql可以分為Server層和存儲引擎層二部分。

Server層有連接器/緩存/分析器/優(yōu)化器/執(zhí)行器,涵蓋了mysql的很多核心功能。

存儲引擎層負(fù)責(zé)數(shù)據(jù)的存儲和讀取,支持Innodb,MyIsam,Memory,BlackHole等,Mysql5.5版本后默認(rèn)的存儲引擎是Innodb。

接下來我們一層一層來看SQL語句的執(zhí)行過程。

1)連接器

首先客戶端連接mysql時就是連接到了連接器上,連接器負(fù)責(zé)跟客戶端建立連接/校驗用戶身份,獲取權(quán)限。連接命令一般如下:

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

當(dāng)客戶端輸入完了用戶名和密碼開始連接時,連接器會校驗:

  • 如果用戶名或者密碼不正確,客戶端會收到一個“Access denied for user”的錯誤。
  • 如果用戶名和密碼校驗正確,連接器會檢查用戶所擁有的權(quán)限。之后,這個連接里的權(quán)限邏輯判斷,都依賴此時讀到的權(quán)限。

這就意味著一個用戶成功建立連接之后,即使你用管理員把這個用戶的權(quán)限更改了,也是不會影響到已經(jīng)連接的這個用戶,除非這個用戶斷開重新連接。讓連接器重新讀取權(quán)限才可以。

 

2)查詢緩存

連接建立成功之后,你就能夠執(zhí)行select等語句了,這時就會進行第二步:查詢緩存

Mysql收到一個sql請求之后,先檢查緩存,看看之前是不是有執(zhí)行過。如果執(zhí)行過并緩存沒有過期,結(jié)果會以key-value的形式存儲在內(nèi)存中,key是查詢語句,value是查詢結(jié)果。如果有緩存,直接把對應(yīng)的value返回給客戶端。

如果語句不在查詢緩存中,就會向下執(zhí)行下面的階段,執(zhí)行完成后,會把結(jié)果放到緩存中。

查詢緩存的失效很平凡,因為只要更新一個表,那么這個表的所有查詢緩存結(jié)果都會被清空,所以對經(jīng)常變更的表,查詢緩存的命中率很低。除非這個表數(shù)據(jù)比較穩(wěn)定,不經(jīng)常改變,才適合查詢緩存。

了解下:Mysql8.0版本之后,查詢緩存的功能就被刪了。

MySql基礎(chǔ)架構(gòu)以及SQL語句執(zhí)行流程

 

3)分析器

如果沒用命中緩存,分析器就開始工作了,對sql語句進行解析。

首先分析器會做“詞法分析”,你輸入的多個字符加上空格組成的sql語句,分析器需要分析出來里面字符分別都代表什么。

如從你輸入的"select"關(guān)鍵字開始,mysql知道這是一個查詢語句,然后分析出那個是表名,那個是你輸入的條件等等。

做完了詞法分析,開始做“語法分析”,根據(jù)詞法分析的結(jié)果,語法分析會判斷你輸入的這條sql語句是否符合Mysql語法。

如果你的語句不對,就會收到“You have an error in you SQL syntax”的錯誤提醒,如果下面這個語句select少打了開頭的字母“s”。

mysql> elect * from stu;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'elect * from stu' at line 1

一般語法錯誤會提示第一個出現(xiàn)錯誤的位置,所以你要關(guān)注的是緊接著“use near”后面的內(nèi)容。

4)優(yōu)化器

經(jīng)過了分析器,Mysql已經(jīng)知道你要做什么了,在開始執(zhí)行之前,還需要經(jīng)過優(yōu)化器的處理。

優(yōu)化器是在表里面有多個索引的時候,決定使用哪個索引;或者在一個語句有多表關(guān)聯(lián)的時候,決定各個表的連接順序。

5)執(zhí)行器

Mysql通過分析器知道了你要做什么,通過優(yōu)化器知道了如何做,接下來就是執(zhí)行器開始執(zhí)行語句;

開始執(zhí)行之前, 會先判斷你對要操作的表或庫有沒有權(quán)限,如果沒有就返回權(quán)限的錯誤。

如果有權(quán)限,就打開表繼續(xù)執(zhí)行。打開表的時候,執(zhí)行器會根據(jù)表的引擎定義,去使用這個引擎提供的接口。

比如這個select語句:select * from db1 where ID=100;

  • 先調(diào)用Inodb引擎接口獲取表的第一行,判斷ID值是不是100,如果不是則跳過,如果是則將結(jié)果存在結(jié)果集中;
  • 調(diào)用引擎接口獲取“下一行”,重復(fù)相同的判斷邏輯,直到讀取這個表的最后一行。
  • 執(zhí)行器將上述遍歷過程所有符合要求的結(jié)果返回給客戶端。

至此,這個select語句算是執(zhí)行完了。

數(shù)據(jù)庫的慢查詢?nèi)罩局袝吹絩ows_examined的字段,表示這個語句執(zhí)行過程中掃描了多少行。這個值就是在執(zhí)行器每次調(diào)用引擎獲取數(shù)據(jù)行的時候累加的。

有些情況下,執(zhí)行器調(diào)用一次,在引擎內(nèi)部則掃描了多行,因此引擎掃描行數(shù)跟rows_examined并不完全相同。

這樣Mysql的邏輯架構(gòu)和流程過了一遍,我也對整個sql語句的執(zhí)行過程的各個階段有了一個初步的認(rèn)識。也希望能對大家有幫助。

分享到:
標(biāo)簽:架構(gòu) 基礎(chǔ) MySql
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定