1. 整體架構圖
和其它資料庫相比,mysql有點與眾不同,它的架構可以在多種不同場景中應用並發揮良好作用。主要體現在儲存引擎的架構上,外掛程式式的儲存引擎架構將查詢處理和其它的系統任務以及資料的儲存提取相分離。這種架構可
以根據業務的需求和實際需要選擇合適的儲存引擎。
各層介紹:
最上層是一些客戶端和連線服務,包含本地sock通訊和大多數基於客戶端/服務端工具實現的類似於tcp/ip的通訊。主要完成一些類似於連線處理、授權認證、及相關的安全方案。在該層上引入了執行緒池的概念,為通過認證安全接入的客戶端提供執行緒。同樣在該層上可以實現基於ssl的安全鏈結。伺服器也會為安全接入的每個客戶端驗證它所具有的操作許可權。
management serveices & utilities
系統管理和控制工具
sql inte***ce:
sql介面。接受使用者的sql命令,並且返回使用者需要查詢的結果。比如select from就是呼叫sql inte***ce
parser
解析器。 sql命令傳遞到解析器的時候會被解析器驗證和解析
optimizer
查詢優化器。 sql語句在查詢之前會使用查詢優化器對查詢進行優化,比如有where條件時,優化器來決定先投影還是先過濾。
cache和buffer
查詢快取。如果查詢快取有命中的查詢結果,查詢語句就可以直接去查詢快取中取資料。這個快取機制是由一系列小快取組成的。比如表快取,記錄快取,key快取,許可權快取等
儲存引擎層,儲存引擎真正的負責了mysql中資料的儲存和提取,伺服器通過api與儲存引擎進行通訊。不同的儲存引擎具有的功能不同,這樣我們可以根據自己的實際需要進行選取。
資料儲存層,主要是將資料儲存在執行於裸裝置的檔案系統之上,並完成與儲存引擎的互動。
利用show profile可以檢視sql的執行週期!
檢視profile是否開啟:show variables like '%profiling%'
如果沒有開啟,可以執行set profiling=1開啟!
執行show prifiles命令,可以檢視最近的幾次查詢。
根據query_id,可以進一步執行show profile cpu,block io for query query_id來檢視sql的具體執行步驟。
mysql的查詢流程大致是:
mysql客戶端通過協議與mysql伺服器建連線,傳送查詢語句,先檢查查詢快取,如果命中,直接返回結果,否則進行語句解析,也就是說,在解析查詢之前,伺服器會先訪問查詢快取(query cache)——它儲存select語句以及相應的查詢結果集。如果某個查詢結果已經位於快取中,伺服器就不會再對查詢進行解析、優化、以及執行。它僅僅將快取中的結果返回給使用者即可,這將大大提高系統的效能。
語法解析器和預處理:首先mysql通過關鍵字將sql語句進行解析,並生成一顆對應的「解析樹」。mysql解析器將使用mysql語法規則驗證和解析查詢;預處理器則根據一些mysql規則進一步檢查解析數是否合法。
查詢優化器當解析樹被認為是合法的了,並且由優化器將其轉化成執行計畫。一條查詢可以有很多種執行方式,最後都返回相同的結果。優化器的作用就是找到這其中最好的執行計畫。。
然後,mysql預設使用的btree索引,並且乙個大致方向是:無論怎麼折騰sql,至少在目前來說,mysql最多只用到表中的乙個索引。
手寫的順序:
真正執行的順序:
隨著mysql版本的更新換代,其優化器也在不斷的公升級,優化器會分析不同執行順序產生的效能消耗不同而動態調整執行順序。下面是經常出現的查詢順序:
對比項myisam
innodb
外來鍵不支援
支援事務
不支援支援
行表鎖表鎖,即使操作一條記錄也會鎖住整個表,不適合高併發的操作
行鎖,操作時只鎖某一行,不對其它行有影響,
適合高併發的操作
快取只快取索引,不快取真實資料
不僅快取索引還要快取真實資料,對記憶體要求較高,而且記憶體大小對效能有決定性的影響
關注點讀效能
併發寫、事務、資源
預設安裝yy
預設使用ny
自帶系統表使用yn
show engines:檢視所有的資料庫引擎
檢視預設的資料庫引擎
第13章 MySQL高階程式設計
1.事務 乙個或一系列的查詢 2.使用事務安全的 型別 通過innodb 關閉自動提交 set autocommit 0 若自動提交被開啟,須使用如下語句開始乙個事務 start transaction 若自動提交是關閉的則不需要此句 完成組成事務的語句輸入後,提交給資料庫 commit 回到資料庫...
mysql高階3 MYSQL高階
檢視 create view v employee asselect a.empid,a.empname,a.gender,b.deptname from employee a left join dept b on a.deptid b.deptid select from v employee ...
第3章 MySQL 儲存引擎簡介
mysql 在5.1 不包括 之前的版本中,儲存引擎是需要在mysql 安裝的時候就必須和mysql 一起被編譯並同時被安裝的。也就是說,5.1 之前的版本中,雖然儲存引擎層和sql層的耦合已經非常少了,基本上完全是通過介面來實現互動,但是這兩層之間仍然是沒辦法分離的,即使在安裝的時候也是一樣。my...