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

来源:https://www.cnblogs.com/imyanger/archive/2019/11/14/11863293.html
-Advertisement-
Play Games

對於MySQL而言,其實分為客戶端與服務端。 服務端,就是MySQL應用,當我們使用net start mysql命令啟動的服務,其實就是啟動了MySQL的服務端。 客戶端,負責發送請求到服務端並從服務端獲取數據,客戶端可以有多種形式,可以是我們通過mysql uroot p1234打開的黑視窗,也 ...


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

  • 服務端,就是MySQL應用,當我們使用net start mysql命令啟動的服務,其實就是啟動了MySQL的服務端。

  • 客戶端,負責發送請求到服務端並從服務端獲取數據,客戶端可以有多種形式,可以是我們通過mysql -uroot -p1234打開的黑視窗,也可以是我們使用的Nativecat、SQLyog等資料庫連接工具,甚至我們的程式,也可以稱作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會做一些優化處理,例如在表裡面有多個索引的時候,決定使用哪個索引,或者在一個語句有多表關聯(join)的時候,決定各個表的連接順序。

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

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

執行器

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

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

存儲引擎

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

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

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ### 視圖函數中可以返回哪些值: 1.可以返回字元串:返回的字元串其實底層將這個字元串包裝成了一個“Response”對象。 2.可以返回元組:元組的形式是(響應體,狀態碼,頭部信息),也不一定三個都要寫,寫兩個也是可以的,返回的元組,其實在底層也是包裝成了一個“Response”對象。 3.可以 ...
  • 向指定文件寫入數據,如果文件不存在,則創建文件,寫入數據之前清空文件 ...
  • 一.什麼是分散式配置中心? 就是為微服務架構中的微服務提供集中化的外部配置支持,配置中心為各個微服務應用的所有環境提供了中心化的外部配置(可能比較難理解,想知道是什麼意思就要知道為什麼這麼配置:這麼配置就是為瞭解決微服務中很多個provider中的application.properties配置管理 ...
  • Selenium是一個自動化測試工具,利用它我們可以驅動瀏覽器執行特定的動作,如點擊、下拉等操作。 本文將從環境部署到項目開發一步步講解,包括這個過程所可能遇到的一些問題,都會一一解答,有不會的問題可以在下方評論留言一起思考解決。 一.環境部署 環境部署包括mac和linux 1.安裝Seleniu ...
  • 上面那些代碼非常不容易理解,我們需要把它拆分來看當我們直接實例化一個類的時候,如果大括弧豎著排,那麼裡面的成員賦值後要加個逗號 定義一個介面,介面裡面有一個成員方法 定義另一個類型,這個類型剛好就有這個方法,那麼就可以認為這個類型實現了介面 這個時候如果定義Flag類型的變數,那麼StringFla ...
  • 1、埠轉發 在虛擬機設置各個資料庫對應的埠轉發 2、修改資料庫配置文件 預設只有本機的IP才可以訪問,其它IP就連不上了,修改bind ip 為0.0.0.0 3、重啟服務(或者直接重啟虛擬機) service mongodb restart ...
  • 常用的高級程式設計語言 常用的高級程式設計語言 語言 特點 FORTRAN 數值計算 COBOL 事務處理 PASCAL 結構化程式設計 LISP 函數式程式設計 PROLOG 邏輯程式設計 C 系統程式設計 Smalltalk 面向對象程式設計 Java Internet應用,可移植性 Pytho ...
  • Lambda表達式 :也可稱為閉包,Lambda允許把函數作為一個方法的參數(函數作為參數傳遞到方法中),免去了使用匿名方法的麻煩,並且給予Java簡單但是強大的函數化的編程能力 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...