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

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

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

想要深入的了解MySQL,首先要了解MySQL語句是怎么實現(xiàn)的,了解了MySQL里語句的執(zhí)行過程可以更加快速的分析問題的原因,或者進行合理的優(yōu)化。

MySQL語句是怎么實現(xiàn)的?需要進行合理的優(yōu)化分析

 

MySQL的架構(gòu)

MySQL的架構(gòu)圖如下所示,主要由以下幾個部分組成:連接器,緩存,分析器,優(yōu)化器,執(zhí)行器和存儲引擎。

MySQL語句是怎么實現(xiàn)的?需要進行合理的優(yōu)化分析

 

MySQL可以分為server層和存儲引擎層,server層包括連接器、分析器、優(yōu)化器和執(zhí)行器,主要負(fù)責(zé)SQL語法的解析,內(nèi)置函數(shù)的實現(xiàn),觸發(fā)器,視圖等。存儲引擎層負(fù)責(zé)數(shù)據(jù)的存儲和提取,存儲引擎是插件式的,MySQL支持的存儲引擎就有InnoDB、MyISAM、Memory等。目前,InnoDB是mysql默認(rèn)的存儲引擎。

連接器

連接器負(fù)責(zé)與客戶端建立網(wǎng)絡(luò)連接、校驗用戶名密碼、校驗用戶權(quán)限、維持和管理連接等。

網(wǎng)絡(luò)連接建立后,首先驗證用戶名和密碼,用戶名和密碼驗證通過以后連接器會到權(quán)限表里查詢該用戶的權(quán)限。之后,這個連接里的權(quán)限判斷邏輯,都將依賴于此時讀到的權(quán)限。這就意味著,一個用戶成功連接后,再去修改該用戶的權(quán)限,也不會影響到已經(jīng)建立好的連接,只有重新建立連接權(quán)限才會生效。

MySQL的網(wǎng)絡(luò)連接采用的是多線程模型,維護一個線程池,每當(dāng)有一個新的連接請求時,就從空閑的線程池中選擇一個線程進行處理。可以使用 show processlist 命令看到當(dāng)前所建立的所有連接。

+------------+--------------+--------------------+------------------+---------+-------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------------+--------------+--------------------+------------------+---------+-------+-------+------------------+
| 1801071833 | user_name | 10.1.1.1:49788 | test_db | Sleep | 131 | | NULL | 
| 2309292411 | user_name | 10.1.1.1:57642 | test_db | Query | 0 | NULL | show processlist |
復(fù)制代碼

ID 表示建立連接的線程 ID ??蛻舳巳绻欢螘r間沒有動作, Command 一欄就會顯示Sleep,表示該連接處于空閑狀態(tài)。 多線程的模型必然存在連接數(shù)有限的問題,因此客戶端如果太長時間沒有動靜,連接器就會自動斷開,回收線程。

緩存

連接建立后,就可以執(zhí)行查詢語句。查詢語句首先會查詢緩存中是否該語句的緩存結(jié)果,因為MySQL查詢語句的執(zhí)行結(jié)果可能會已K-V的形式存儲在緩存中,SQL語句做KEY,查詢的結(jié)果做值。

但是MySQL自帶的緩存不建議使用,因為MySQL的緩存失效的非常頻繁,只要對一個表有更新,那么這個表上所有的緩存都會失效,因此緩存命中率很低。不如在業(yè)務(wù)層用redis或者Memcached做緩存來的靈活高效。

MySQL語句是怎么實現(xiàn)的?需要進行合理的優(yōu)化分析

 

分析器

如果緩存沒有命中或者沒用使用緩存,查詢語句就會到達分析器,分析器就是一個編程語言的解析器,解析的是SQL語言。分析器的工作主要分為兩個部分:

1 詞法分析:詞法分析時分析器會分析SQL語句中每個用空格或者逗號分割的字符串,把SELECT關(guān)鍵詞提取出來,把語句里的標(biāo)識為表名的字符串對應(yīng)到MySQL的表,把每一個column對應(yīng)到表里的字段。

2 語法分析:語法分析就是整個SQL語句是否滿足語法要求,滿足則能執(zhí)行成功,不滿足則報錯。

優(yōu)化器

優(yōu)化器的功能一句話就能描述,卻非常重要,決定了查詢的性能。優(yōu)化器是在表里面有多個索引的時候,決定使用哪個索引;或者在聯(lián)表查詢時決定用哪一張表關(guān)聯(lián)哪一張表。

執(zhí)行器

執(zhí)行器的功能就是調(diào)用存儲引擎的API存入數(shù)據(jù)或者取出數(shù)據(jù)。在調(diào)用存儲引擎的API之前會先進行權(quán)限校驗,校驗該用戶是否有對該表相應(yīng)的操作權(quán)限。存儲引擎如果索引沒有命中,存儲引擎就一條條掃表,直到查到指定的數(shù)據(jù),然后返回給server層。如果命中了索引,存儲引擎就在索引命中的數(shù)據(jù)中一條條掃描,直到查到指定的數(shù)據(jù)。如果索引類型為const類型,那么存儲引擎會直接命中,然后返回。

查詢語句如何實現(xiàn)

說完了MySQL的架構(gòu),我們用一個例子來總結(jié)一下一條查詢語言是如何實現(xiàn)的

select * from t where id = 123 and name = 'tom'
復(fù)制代碼

1 客戶端與MySQL服務(wù)端建立網(wǎng)絡(luò)連接,連接語句譬如:

mysql -h 127.0.0.1 -P 3306 -u 'name' -p'password!' database_name -A --default-character-set=utf8
復(fù)制代碼

這條語句指定了MySQL服務(wù)器的地址為 127.0.0.1 ,也就是本機,端口號為3306,用戶名為name,密碼為password。指定庫名為database_name,指定默認(rèn)字符集為utf8。

2 完成連接后,如果開啟了MySQL的緩存機制,這時候會先去查詢緩存是否命中,如果緩存命中則直接返回緩存中的數(shù)據(jù),如果緩存沒有命中則繼續(xù)向下執(zhí)行。

3 分析器會分析每個詞是否是有意義的,比如會解析到 select 是SQL的關(guān)鍵詞, t 是表名, id 和 name 是表名中的字段.然后分析SQL的語法是否正常,該條語句可以正常執(zhí)行。

4 優(yōu)化器會分析在字段 id 和 name 上是否有索引,應(yīng)該選擇哪個索引。如果表 t 是以 id 為主鍵,那么分析器就會直接走主鍵索引了。

5 執(zhí)行器開始執(zhí)行前會先校驗該用戶是否有對該的讀權(quán)限。通過權(quán)限校驗后,執(zhí)行器會調(diào)用存儲引擎的API查詢出這條數(shù)據(jù),返回給客戶端。

更新語句如何實現(xiàn)

一條更新語句的執(zhí)行也要經(jīng)歷一條查詢語句所要經(jīng)歷的幾個階段,連接器建立連接、分析器分析語法、優(yōu)化器選擇索引,執(zhí)行器調(diào)用存儲引擎的API,與查詢語句相比,更新語句更為復(fù)雜,因為MySQL的InnoDB引擎要保證在數(shù)據(jù)庫機器宕機以后數(shù)據(jù)不丟失。

同樣以一個例子來總結(jié)查詢語句是如何實現(xiàn)的

update t set name = 'tom' where id = 123
復(fù)制代碼

1 客戶端與MySQL服務(wù)端建立網(wǎng)絡(luò)連接

2 分析器解析出這是一條更新語句

3 優(yōu)化器選擇主鍵索引,假設(shè)以 id 做該表的主鍵

4 執(zhí)行器首先查詢內(nèi)存中是否有表 t 中 id 等于123的這一行數(shù)據(jù),如果沒有則通過存儲引擎將這行數(shù)據(jù)取到內(nèi)存中

5 執(zhí)行器修改 name 字段為tom,得到一個新的行

6 存儲引擎將新行的數(shù)據(jù)寫入內(nèi)存,并寫redo log日志, 此時 redo log 處于 prepare 狀態(tài)

7 執(zhí)行器寫bin log日志

8 存儲引擎修改redo log日志為commit狀態(tài)

MySQL語句是怎么實現(xiàn)的?需要進行合理的優(yōu)化分析

 

以上步驟就是一個完整的更新語句執(zhí)行過程,細(xì)心的讀者會發(fā)現(xiàn)更新的數(shù)據(jù)只寫入到內(nèi)存,還沒有持久化到磁盤,mysql異步定期將內(nèi)存中的數(shù)據(jù)寫入到磁盤,這一過程和操作系統(tǒng)的文件系統(tǒng)讀寫很像,文件系統(tǒng)中有一個page cache,寫文件時先寫cache然后用一個獨立的進程將數(shù)據(jù)刷到磁盤。mysql使用了redo log日志,因此即使服務(wù)器宕機,數(shù)據(jù)也不會丟失,可以從redo log日志中恢復(fù)。

 

redo log日志與bin log日志

1 redo log日志是由server層來寫,bin log日志由存儲引擎來寫的;

2 redo log 是物理日志,記錄的是“在某個數(shù)據(jù)頁上做了什么修改",bin log用于記錄邏輯操作。在statement模式時,bin log記的就是SQL語句;

3 redo log日志循環(huán)寫的,空間用完后,要先將數(shù)據(jù)刷到磁盤,然后清理空間。bin log日志是追加寫入的;

4 redo log日志用于數(shù)據(jù)庫崩潰后恢復(fù)數(shù)據(jù),而bin log日志則用于主備同步,數(shù)據(jù)備份等;
 

分享到:
標(biāo)簽: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)練成績評定