大家好!這是我的第一篇文章。
這篇文章我將介紹一條sql查詢語句是如何執行的
下面是MySQL架構圖:
總的來說,MySQl可以分成兩個部分:伺服器層和儲存引擎層。
伺服器層包括連接器、查詢快取、解析器、最佳化器、執行器等,包含MySQL的大部分核心服務功能,以及所有內建功能(如日期、時間、數學和加密)功能)。所有跨儲存引擎的功能,例如預存程序、觸發器和視圖都在這一層實現。
儲存引擎層負責資料的儲存與檢索。其架構是基於插件的,支援InnoDB、MyISAM、Memory等多種儲存引擎。從MySQL 5.5.5開始,InnoDB成為MySQL的預設儲存引擎。
建立表格時可以使用具有engine=memory的create table語句指定記憶體引擎。
不同的儲存引擎共用同一個Server層
連接器
第一步是連接資料庫,這需要連接器。連接器負責與客戶端建立連線、取得權限並維護和管理連線。連線指令為:
此指令用於與伺服器建立連線。完成經典的 TCP 握手後,連接器將使用提供者的使用者名稱和密碼來驗證您的身分。
- 如果使用者名稱或密碼不正確,您將收到「使用者錯誤導致存取被拒絕」的訊息,並且客戶端程式將終止。
- 如果驗證成功,連接器將從權限表中擷取目前帳戶的權限。此連線期間的所有權限檢查都依賴此初始檢索。
這表示一旦連線成功建立,管理員對使用者權限所做的任何變更都不會影響現有連線的權限。只有新連線才會使用更新後的權限設定。
連線建立後,如果沒有後續動作,則連線進入空閒狀態,可以使用show processlist指令查看:
如果客戶端長時間處於不活動狀態,連接器將自動斷開連線。持續時間由 wait_timeout 參數控制,預設為 8 小時。
如果連線終止且用戶端傳送請求,則會收到錯誤訊息:在查詢期間遺失與 MySQL 伺服器的連線。要繼續,您需要重新連接,然後執行請求。
在資料庫中,持久連線是指客戶端在成功連線後為連續請求保持相同的連線。短連接是指在幾次查詢後斷開連接並重新連接以進行後續查詢。
由於連接過程較為複雜,建議開發過程中盡量減少連接的創建,即盡可能使用持久連接。
但是,當使用持久連接時,MySQL 的記憶體使用量可能會顯著增加,因為執行期間使用的臨時記憶體是在連接物件內管理的。只有當連線終止時,這些資源才會被釋放。如果長連線不斷累積,可能會導致記憶體使用過多,導致系統強行終止MySQL(OOM),導致意外重新啟動。
解:
- 定期斷開持久連線。使用連接一段時間或執行消耗過多記憶體的查詢後,請中斷連線並重新連線以進行後續查詢。
- 如果您使用的是 MySQL 5.7 或更高版本,您可以在執行資源密集型作業後使用 mysql_reset_connection 來重新初始化連線資源。此過程不需要重新連線或重新驗證,而是將連線重設為剛剛建立的狀態。
查詢快取
注意:從 MySQL 8.0 開始,查詢快取功能已完全刪除,因為其弊大於利。
當MySQL收到查詢請求時,它會先檢查查詢緩存,看看這個查詢之前是否已經執行過。之前執行過的查詢及其結果以鍵值對的形式緩存在記憶體中。鍵是查詢語句,值是結果。如果在查詢快取中找到該鍵,則將該值直接傳回給用戶端。
如果在查詢快取中找不到查詢,則流程繼續。
為什麼查詢快取弊大於利?
查詢快取失效的情況非常頻繁地發生。對錶的任何更新都會清除與該表相關的所有查詢緩存,導致緩存命中率非常低,除非該表是靜態配置表。
MySQL提供了一種「按需」的方法來使用查詢快取。透過將參數query_cache_type設定為DEMAND,SQL語句預設不會使用查詢快取。要使用查詢緩存,可以明確指定 SQL_CACHE:
解析器
如果查詢快取沒有命中,則語句執行程序開始。 MySQL 首先需要了解要做什麼,因此它會解析 SQL 語句。
解析器先執行詞法分析。輸入的 SQL 語句由字串和空格組成,MySQL 會對其進行分析,以識別每個部分所代表的含義。例如select識別為查詢語句,T識別為表名,ID識別為列。
詞法分析之後,進行語法分析。語法分析器根據詞法分析的結果來判斷SQL語句是否符合MySQL的語法規則。
如果有語法錯誤,將會顯示類似「您的 SQL 語法有錯誤」的錯誤訊息。例如,在以下查詢中,select 關鍵字拼字錯誤:
最佳化器
解析之後,MySQL 知道你想做什麼。接下來,優化器確定如何執行。
當一個表有多個索引時,最佳化器決定使用哪個索引,或當查詢涉及多個表時,最佳化器決定表連接的順序。例如,在以下查詢中:
查詢可以從檢索 t1 或 t2 中的值開始。兩種方法產生相同的邏輯結果,但它們的性能可能不同。優化器的作用是選擇最有效的計劃。
最佳化階段結束後,流程進入執行器。
執行者
執行器開始執行查詢。
執行前,先檢查目前連線是否有查詢表的權限。如果沒有,則傳回錯誤,指示權限不足。 (從查詢快取傳回結果時也會執行權限檢查。)
如果授予權限,則開啟表格並繼續執行。在此過程中,執行器根據表的引擎定義與儲存引擎進行互動。
例如,假設表 T 在 ID 欄位上沒有索引。執行者的執行過程如下:
- 呼叫InnoDB引擎介面取出表的第一行,檢查ID值是否為10,如果不是則跳過;如果是,則將其新增至結果集中。
- 呼叫引擎介面取得“下一行”,重複相同的邏輯,直到檢查完所有行。
- 執行器將累積的結果集傳回給客戶端。
至此,查詢完成。
對於索引表,該過程涉及使用引擎的預定義方法來迭代獲取「第一個匹配行」和「下一個匹配行」。
慢查詢日誌中,rows_examined欄位表示查詢執行過程中掃描的行數。每次執行器呼叫引擎檢索資料行時,該值都會累積。
在某些情況下,對執行器的單次呼叫可能涉及在引擎內部掃描多行。因此,引擎掃描的行數不一定等於 rows_examined.
結尾
感謝您的閱讀!希望文章對您有幫助。
以上是SQL查詢語句是如何執行的的詳細內容。更多資訊請關注PHP中文網其他相關文章!

掌握添加MySQL用戶的方法對於數據庫管理員和開發者至關重要,因為它確保數據庫的安全性和訪問控制。 1)使用CREATEUSER命令創建新用戶,2)通過GRANT命令分配權限,3)使用FLUSHPRIVILEGES確保權限生效,4)定期審計和清理用戶賬戶以維護性能和安全。

chosecharforfixed-lengthdata,varcharforvariable-lengthdata,andtextforlargetextfield.1)chariseffity forconsistent-lengthdatalikecodes.2)varcharsuitsvariable-lengthdatalikenames,ballancingflexibilitibility andperformance.3)

在MySQL中處理字符串數據類型和索引的最佳實踐包括:1)選擇合適的字符串類型,如CHAR用於固定長度,VARCHAR用於可變長度,TEXT用於大文本;2)謹慎索引,避免過度索引,針對常用查詢創建索引;3)使用前綴索引和全文索引優化長字符串搜索;4)定期監控和優化索引,保持索引小巧高效。通過這些方法,可以在讀取和寫入性能之間取得平衡,提升數據庫效率。

ToaddauserremotelytoMySQL,followthesesteps:1)ConnecttoMySQLasroot,2)Createanewuserwithremoteaccess,3)Grantnecessaryprivileges,and4)Flushprivileges.BecautiousofsecurityrisksbylimitingprivilegesandaccesstospecificIPs,ensuringstrongpasswords,andmonitori

tostorestringsefliceflicyInmySql,ChooSetherightDataTypeBasedyOrneOrneEds:1)USEcharforFixed-LengthStstringStringStringSlikeCountryCodes.2)UseVarcharforvariable-lengtthslikenames.3)USETEXTCONTENT.3)

選擇MySQL的BLOB和TEXT數據類型時,BLOB適合存儲二進制數據,TEXT適合存儲文本數據。 1)BLOB適用於圖片、音頻等二進制數據,2)TEXT適用於文章、評論等文本數據,選擇時需考慮數據性質和性能優化。

No,youshouldnotusetherootuserinMySQLforyourproduct.Instead,createspecificuserswithlimitedprivilegestoenhancesecurityandperformance:1)Createanewuserwithastrongpassword,2)Grantonlynecessarypermissionstothisuser,3)Regularlyreviewandupdateuserpermissions

mySqlStringDatatAtatPessHouldBechoseBasedondatActarActeristicsAndusecases:1)USEcharforFixed lengthStstringStringStringSlikeCountryCodes.2)usevarcharforvariable-lengtthslikeLikenames.3)usebarnionororvarinyorvarinyorvarybinarydatalgebenedaTalgeextocrabextrapon.4)


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器