心裡記著一張MySQL組件關系圖對於理解MySQL服務器有很大幫助。圖1-1展示了一張MySQL架構的邏輯視圖。最上面一層包含的服務不是MySQL所獨有的。它是多數基於網絡的客戶端/服務器工具或者服務所需要的:連接處理、鑒權、安全等等。
圖1-1 MySQL邏輯架構圖
從第二層開始,事情才變得有趣起來。MySQL的重要組件都在這部分,包括查詢的解析、分析、優化、緩存以及其他所有的內置函數(如日期函數,時間函數,數學函數以及加密函數等)。另外所有存儲引擎所共有的功能也都在這一層,比如存儲過程、觸發器、視圖等。
第三層包括了存儲引擎。存儲引擎負責在MySQL中存儲和獲取數據。如同GNU/Linux的眾多文件系統一樣,這些存儲引擎同樣有著自己的優勢與缺點。服務器通過存儲引擎API來與存儲引擎進行交互。這個接口隱藏了各個存儲引擎之間實現上的差異,並且很大程度上使得存儲引擎與查詢層分開。這個 API包括了許許多多的底層函數來執行諸如“開始一個事務”或者“獲取包括這個主鍵的行”等操作。存儲引擎不解析SQL(有一個例外是InnoDB存儲引擎中解析外鍵定義時還需要解析SQL,因為MySQL在查詢層沒有對外鍵進行實現。),也不和其他存儲引擎進行直接交互,它們只是簡單的響應服務器的請求。
1.1.1. 連接管理與安全在服務器進程內每個客戶端連接會得到一個單獨的線程。這個連接的所有查詢都在那個線程內執行,而這些線程輪流地駐留在CPU或者其中一個核上(多核情況)。服務器會緩存創建的線程,因此不需要為每個新的連接都創建或者銷毀線程。(MySQL AB計劃在未來的服務器版本中將連接與線程分開)
當客戶端應用連接到服務器時,服務器需要對它進行鑒權。鑒權是基於用戶名、客戶端地址以及密碼的。X.509的證書也可以用在基於安全套接字層 (SSL)的連接之上。當一個客戶端連接到服務器後,服務器會驗證客戶端是否有權限執行它所發出的每個查詢,(比如檢查用戶是否有權限在world數據庫上的country表上執行一個SELECT語句。)在第十二章,我們將會詳細介紹這部分的內容。
1.1.2. 優化與執行MySQL通過解析請求來生成一個內部結構體(解析樹),然後在此基礎上應用一系列的優化策略。這些策略可能包括重寫請求,確認讀取表的順序,決定用哪些索引等等。你也可以在查詢語句中添加一些特殊的關鍵字來影響優化器的優化策略選擇。你也可以要求服務器來解釋優化的各個方面。這可以使得你知道服務器在優化時所做的決定,以此為參考可以修改查詢語句,數據庫表定義以及設置等,以使數據庫盡可能高效的運行。我們將在第四章詳細介紹優化器的知識。
優化器實際上可以不關心存儲引擎具體使用哪一個數據庫表,但是存儲引擎卻可以對服務器如優化查詢產生影響。優化器會向存儲引擎詢問它的一些能力,特定操作的代價以及表數據的統計信息。比如有些存儲引擎所支持的索引類型對於特定的查詢很有幫助。我們將會在第三章詳細介紹索引以及數據庫模式的優化。
在解析查詢之前,服務器會先詢問查詢緩存,查詢緩存中只存儲SELECT語句以及它對應的結果。如果有人發出了一條和查詢緩存中已經存在的 SELECT語句一樣的查詢請求,那麼服務器就不必解析、優化甚至執行-它只是簡單地將已經存在的結果集返回。我們將會在“MySQL查詢緩存”一節中詳細對此進行描述。