成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL系列:一句SQL,MySQL是怎么工作的?

數據庫 MySQL
當我們在mysql窗口或者數據庫連接工具中輸入一句sql后,我們就可以獲取到想要的數據,這中間MySQL到底是怎么工作的呢?

對于MySQL而言,其實分為客戶端與服務端。

  • 服務端,就是MySQL應用,當我們使用net start mysql命令啟動的服務,其實就是啟動了MySQL的服務端。
  • 客戶端,負責發送請求到服務端并從服務端獲取數據,客戶端可以有多種形式,可以是我們通過mysql -uroot -p1234打開的黑窗口,也可以是我們使用的Nativecat、SQLyog等數據庫連接工具,甚至我們的程序,也可以稱作MySQL的客戶端。

而當我們在mysql窗口或者數據庫連接工具中輸入一句sql后,我們就可以獲取到想要的數據,這中間MySQL到底是怎么工作的呢?

MySQL系列:一句SQL,MySQL是怎么工作的?

 

在我們執行SQL后,例如一句簡單的select * from user where name = ‘yanger’,客戶端發送請求到服務端,請求到達Server層,會經過連接器、查詢緩存、分析器、優化器、執行器等,最終通過存儲引擎從文件系統獲取數據或者插入數據到文件系統。

連接器

在客戶端程序發起連接的時候,需要攜帶主機信息、用戶名、密碼,服務器程序會對客戶端程序提供的這些信息進行認證,如果認證失敗,服務器程序會拒絕連接。

連接命令大家都比較熟悉。

mysql -h$ip -P$port -u$user -p

輸完命令之后,需要繼續輸入密碼,密碼也可以直接跟在 -p 后面,但這樣可能會導致你的密碼泄露,如果你連的是生產服務器,強烈建議你不要這么做。

MySQL采用TCP作為服務器和客戶端之間的網絡通信協議,完成 TCP 握手后,連接器主要做密碼校驗和權限獲取。

  • 如果用戶名或密碼不對,你就會收到一個"Access denied for user"的錯誤
  • 如果用戶名密碼認證通過,連接器會到權限表里面查出你擁有的權限。之后,這個連接里面的權限判斷邏輯,都將依賴于此時讀到的權限

MySQL的默認連接是8小時,由參數 wait_timeout 控制的,如果超過這個時間不使用,會自動斷開,并在之后的操作中,拋出Lost connection to MySQL server during query的錯誤。

查詢緩存

針對于查詢語句,MySQL 拿到一個查詢請求后,會先到查詢緩存看看,之前是不是執行過這條語句,之前執行過的語句及其結果可能會以 key-value 對的形式,被直接緩存在內存中。如果命中緩存,將直接返回結果。如果不在查詢緩存中,就會繼續后面的執行階段。執行完成后,執行結果會被存入查詢緩存中。

針對于更新語句,包含插入刪除語句,MySQL 收到更新請求時,會把查詢緩存中該表相關的緩存數據全部清空。

我們可以看到,只要有更新,緩存就會失效,而對于正常的業務,更新其實是比較頻繁的,也就是說,其實MySQL的查詢緩存命中率并不會很高,所以建議一般不到開啟。

可以通過設置 query_cache_type 為 DEMAND 來關閉查詢緩存功能。而事實上,在 MySQL 8.0 版本,更是直接移除了查詢緩存這一個功能。

分析器

MySQL 首先需要對SQL語句進行分析,分析過程本質上算是一個編譯過程,涉及詞法解析、語法分析、語義分析等階段,通過分析MySQL知道自己要做什么。

如果語句不對,就會收到“You have an error in your SQL syntax”的錯誤提醒,一般語法錯誤會提示第一個出現錯誤的位置,所以你要關注的是緊接“use near”的內容。

MySQL系列:一句SQL,MySQL是怎么工作的?

 

優化器

面對分析器拿到的結果,MySQL會做一些優化處理,例如在表里面有多個索引的時候,決定使用哪個索引,或者在一個語句有多表關聯(join)的時候,決定各個表的連接順序。

優化的結果就是生成一個執行計劃,這個執行計劃表明了應該使用哪些索引進行查詢,表之間的連接順序是啥樣的。我們可以使用EXPLAIN語句來查看某個語句的執行計劃。

MySQL系列:一句SQL,MySQL是怎么工作的?

 

這里\G在命令窗口無法一行時,可以豎著展示結果,方便查看。

執行器

經過了分析器和優化器,就正式進行執行階段了,不過執行之前,需要做權限驗證,如果權限不足,就會拋出權限的錯誤。其實在查詢緩存的時候,一樣也會進行權限校驗。

如果通過驗證,執行器就打開表繼續執行。打開表的時候,執行器就會根據表的引擎定義,去使用這個引擎提供的接口。

存儲引擎

MySQL支持非常多種存儲引擎,常用的是InnoDB和MyISAM,MySQL的默認存儲引擎是InnoDB。

MySQL系列:一句SQL,MySQL是怎么工作的?

 

假如我們選擇是InnoDB引擎,對于查詢,那InnoDB 會取這個表的第一行來進行判斷是不是符合要求,符合則存在結果集中,否則繼續進行下一行,直到該表的最后一行。

然后存儲引擎將結果返回給執行器, 執行器拿著結果返回給客戶端,這樣一句SQL就執行完成了。 

責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2011-06-13 09:25:01

斷號

2025-05-12 01:22:00

2013-03-22 10:53:42

PyConPython

2011-03-28 15:48:52

批量數據綁定

2011-03-24 10:24:45

批量數據綁定

2013-05-10 10:56:09

2023-09-05 23:34:52

Kubernetes云原生

2021-05-11 15:34:04

Task.Result代碼Winform

2015-05-18 10:59:38

程序員選擇比努力更重要

2009-03-10 18:10:12

LinuxUbuntu技巧

2012-02-09 09:41:22

2020-11-27 09:57:11

Python代碼PyPy

2015-08-03 10:21:04

設計模式表達

2022-08-01 10:01:11

JavaScript語言代碼庫

2021-07-26 10:32:54

MySQL數據庫存儲

2023-11-06 08:31:58

業務代碼多線程

2021-12-17 08:55:26

Python微博機器人

2023-07-12 08:01:28

FOADMROADMOXC

2024-12-17 06:20:00

MySQLSQL語句數據庫

2011-06-03 16:42:47

SEO
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品一区三区 | 久久久久久黄 | 中文字幕一区二区三区四区不卡 | 国产 日韩 欧美 中文 在线播放 | 久久精彩视频 | 日韩精品成人在线 | 在线视频日韩精品 | 中文字幕免费观看 | 91视频一区二区三区 | 日本淫视频 | 中文字幕av亚洲精品一部二部 | 成人精品免费视频 | 国产高清久久久 | 国产福利视频在线观看 | 日本免费一区二区三区四区 | 免费亚洲一区二区 | 国产精品永久免费视频 | 久久久久久精 | 亚洲图片一区二区三区 | 91精品国产色综合久久 | 青青草原综合久久大伊人精品 | 久久久久久久久久久久久9999 | 日韩三区| 欧美专区在线 | 亚洲精品视频在线 | 四虎成人精品永久免费av九九 | 亚洲国产精品suv | 中文字幕人成乱码在线观看 | 97精品国产97久久久久久免费 | 日韩精品在线一区 | 国产1区在线| 日韩欧美在线一区 | 久久综合久久综合久久综合 | 男人天堂999 | av电影一区二区 | 日韩欧美视频网站 | 欧美日韩在线一区二区三区 | 日韩影院在线 | 日韩精品久久一区 | 99精品一区二区 | 亚洲免费在线观看av |