我們先下圖看看mysql整體邏輯架構(mysql』s logical architecture)
圖1第二層值得關注。這是mysql的核心部分。通常叫做 sql layer。在 mysql據庫系統處理底層資料之前的所有工作都是在這一層完成的,包括許可權判斷, sql解析,行計畫優化, query cache 的處理以及所有內建的函式(如日期,時間,數**算,加密)等等。各個儲存引擎提供的功能都集中在這一層,如儲存過程,觸發器,視 圖等。
第三層包括了儲存引擎。通常叫做storengine layer ,也就是底層資料訪問操作實現部分,由多種儲存引擎共同組成。它們負責儲存和獲取所有儲存在mysql中的資料。就像linux眾多的檔案系統 一樣。每個儲存引擎都有自己的優點和缺陷。伺服器是通過儲存引擎api來與它們互動的。這個介面隱藏 了各個儲存引擎不同的地方。對於查詢層盡可能的透明。這個api包含了很多底層的操作。如開始乙個事 物,或者取出有特定主鍵的行。儲存引擎不能解析sql,互相之間也不能通訊。僅僅是簡單的響應伺服器 的請求。
連線管理和安全
在伺服器內部,每個client連線都有自己的執行緒。這個連線的查詢都在乙個單獨的執行緒中執行。這些執行緒輪流執行在某乙個cpu核心(多核cpu)或者cpu中。伺服器快取了執行緒,因此不需要為每個client連線單獨建立和銷毀執行緒 。
當clients(也就是應用程式)連線到了mysql伺服器。伺服器需要對它進行認證(authenticate)。認證是基於使用者名稱,主機,以及密碼。對於使用了ssl(安全套接字層)的連線,還使用了x.509證書。clients一連線上,伺服器就驗證它的許可權 (如是否允許客戶端可以查詢world資料庫下的country表的資料)。
優化和執行
優化器並是不關心表使用了哪種儲存引擎,但是儲存引擎對伺服器優化查詢的方式是有影響的。優化器需要知道儲存引擎的一些特性:具體操作的效能和開銷方面的資訊,以及表內資料的統計資訊。例如,儲存引擎支援哪些索引型別,這對於查詢是非常有用的。
在解析查詢之前,要查詢快取,這個快取只能儲存查詢資訊以及結果資料。如果請求乙個查詢在快取 中存在,就不需要解析,優化和執行查詢了。直接返回快取中所存放的這個查詢的結果。
雖然從上圖1看起來 mysql 架構非常的簡單,就是簡單的兩部分而已,但實際上每一層 中都含有各自的很多小模組,尤其是第二層 sql layer ,結構相當複雜的。下面我們就分別 針對 sql layer 和 storage engine layer 做乙個簡單的分析。我們看下圖體系結構:
圖2指的是不同語言中與sql的互動
系統管理和控制工具
管理緩衝使用者連線,執行緒處理等需要快取的需求。
負責監聽對 mysql server 的各種請求,接收連線請求,**所有連線請求到執行緒管理模組。每乙個連線上 mysql server 的客戶端請求都會被分配(或建立)乙個連線線程為其單獨服務。而連線線程的主要工作就是負責 mysql server 與客戶端的通訊,
接受客戶端的命令請求,傳遞 server 端的結果資訊等。執行緒管理模組則負責管理維護這些連線線程。包括執行緒的建立,執行緒的 cache 等。
接受使用者的sql命令,並且返回使用者需要查詢的結果。比如select from就是呼叫sql inte***ce
sql命令傳遞到解析器的時候會被解析器驗證和解析。解析器是由lex和yacc實現的,是乙個很長的指令碼。
在 mysql中我們習慣將所有 client 端傳送給 server 端的命令都稱為 query ,在 mysql server 裡面,連線線程接收到客戶端的乙個 query 後,會直接將該 query 傳遞給專門負責將各種 query 進行分類然後**給各個對應的處理模組。
主要功能:
a . 將sql語句進行語義和語法的分析,分解成資料結構,然後按照不同的操作型別進行分類,然後做出針對性的**到後續步驟,以後sql語句的傳遞和處理就是基於這個結構的。
b. 如果在分解構成中遇到錯誤,那麼就說明這個sql語句是不合理的
sql語句在查詢之前會使用查詢優化器對查詢進行優化。就是優化客戶端請求的 query(sql語句) ,根據客戶端請求的 query 語句,和資料庫中的一些統計資訊,在一系列演算法的基礎上進行分析,得出乙個最優的策略,告訴後面的程式如何取得這個 query 語句的結果
他使用的是「選取-投影-聯接」策略進行查詢。
用乙個例子就可以理解: select uid,name from user where gender = 1;
這個select 查詢先根據where 語句進行選取,而不是先將表全部查詢出來以後再進行gender過濾
這個select查詢先根據uid和name進行屬性投影,而不是將屬性全部取出以後再進行過濾
將這兩個查詢條件聯接起來生成最終查詢結果
他的主要功能是將客戶端提交 給mysql 的 select 類 query 請求的返回結果集 cache 到記憶體中,與該 query 的乙個 hash 值 做
乙個對應。該 query 所取資料的基表發生任何資料的變化之後, mysql 會自動使該 query 的cache 失效。在讀寫比例非常高的應用系統中, query cache 對效能的提高是非常顯著的。當然它對記憶體的消耗也是非常大的。
如果查詢快取有命中的查詢結果,查詢語句就可以直接去查詢快取中取資料。這個快取機制是由一系列小快取組成的。比如表快取,記錄快取,key快取,許可權快取等
儲存引擎介面模組可以說是 mysql 資料庫中最有特色的一點了。目前各種資料庫產品中,基本上只有 mysql 可以實現其底層資料儲存引擎的外掛程式式管理。這個模組實際上只是 乙個抽象類,但正是因為它成功地將各種資料處理高度抽象化,才成就了今天 mysql 可插拔儲存引擎的特色。
從圖2還可以看出,mysql區別於其他資料庫的最重要的特點就是其外掛程式式的表儲存引擎。mysql外掛程式式的儲存引擎架構提供了一系列標準的管理和服務支援,這些標準與儲存引擎本身無關,可能是每個資料庫系統本身都必需的,如sql分析器和優化器等,而儲存引擎是底層物理結構的實現,每個儲存引擎開發者都可以按照自己的意願來進行開發。
注意:儲存引擎是基於表的,而不是資料庫。
mysql與php的連線 PHP與Mysql的連線
寫程式切記馬虎,不細仔,真是寫程式的大忌中的大忌。所以以後寫 務必 細心仔細不驕不燥,才能寫出來好 來,避免迷惘。echo this is a test echo asdfasdfadsf mysql server name localhost 資料庫伺服器名稱 mysql username roo...
重新學習Mysql資料庫1 無廢話MySQL入門
mysql集錦 in 真會導致全表掃瞄嗎?不一定 得看mysql版本 5.5之前的會 in 操作符允許我們在 where 子句中規定多個值。in 操作符用來指定範圍,範圍中的每一條,都進行匹配。in取值規律,由逗號分割,全部放置括號中。語法 select 欄位名 from 名 where 欄位名 i...
mysql 學習與提高5 explain命令詳解
目錄 explain 簡介 explain 使用 explain 字段 1.id欄位 2.select type 3.table 4.type 5.possible keys 6.key 7.key len 8.ref 9.rows 10.extra 注意事項 explain 提供了 mysql 如...