天天看點

MySQL基礎一

MySQL體系架構

MySQL基礎一

可以看出MySQL是由連接配接池、管理工具和服務、SQL接口、解析器、優化器、緩存、存儲引擎、檔案系統組成。

連接配接池

由于每次建立建立需要消耗很多時間,連接配接池的作用就是将這些連接配接緩存下來,下次可以直接用已經建立好的連接配接,提升伺服器性能。

管理工具和服務

系統管理和控制工具,例如備份恢複、Mysql複制、叢集等

SQL接口

接受使用者的SQL指令,并且傳回使用者需要查詢的結果。比如select ... from就是調用SQL接口

解析器

SQL指令傳遞到解析器的時候會被解析器驗證和解析。解析器主要功能:1、将SQL語句分解成資料結構,後續步驟的傳遞和處理就是基于這個結構的。2、将SQL語句分解成資料結構,後續步驟的傳遞和處理就是基于這個結構的。

優化器

查詢優化器,SQL語句在查詢之前會使用查詢優化器對查詢進行優化。

緩存器

查詢緩存,如果查詢緩存有命中的查詢結果,查詢語句就可以直接去查詢緩存中取資料。這個緩存機制是由一系列小緩存組成的。比如表緩存,記錄緩存,key緩存,權限緩存等。

存儲引擎(後面單獨說)

檔案系統(後面單獨說講)

連接配接層

當MySQL啟動(MySQL伺服器就是一個程序),等待用戶端連接配接,每一個用戶端連接配接請求,伺服器程序會建立一個線程專門處理與這個用戶端的互動。當用戶端與該伺服器斷開之後,不會立即撤銷線程,隻會把他緩存起來等待下一個用戶端請求連接配接的時候,将其配置設定給該用戶端。每個線程獨立,擁有各自的記憶體處理空間。

MySQL基礎一

以下指令可以檢視最大的連接配接數:

show VARIABLES like '%max_connections%'           
MySQL基礎一

連接配接到伺服器,伺服器需要對其進行驗證,也就是使用者名、IP、密碼驗證,一旦連接配接成功,還要驗證是否具有執行某個特定查詢的權限(例如,是否允許用戶端對某個資料庫某個表的某個操作)

MySQL基礎一

Server層(SQL處理層)

這一層主要功能有:SQL語句的解析、優化,緩存的查詢,MySQL内置函數的實作,跨存儲引擎功能(所謂跨存儲引擎就是說每個引擎都需提供的功能(引擎需對外提供接口)),例如:存儲過程、觸發器、視圖等。

當然作為一個SQL的執行流程如下:

MySQL基礎一

1.如果是查詢語句(select語句),首先會查詢緩存是否已有相應結果,有則傳回結果,無則進行下一步(如果不是查詢語句,同樣調到下一步)

2.解析查詢,建立一個内部資料結構(解析樹),這個解析樹主要用來SQL語句的語義與文法解析;

3.優化:優化SQL語句,例如重寫查詢,決定表的讀取順序,以及選擇需要的索引等。這一階段使用者是可以查詢的,查詢伺服器優化器是如何進行優化的,便于使用者重構查詢和修改相關配置,達到最優化。這一階段還涉及到存儲引擎,優化器會詢問存儲引擎,比如某個操作的開銷資訊、是否對特定索引有查詢優化等。

緩存(了解即可)

show variables like '%query_cache_type%'   -- 預設不開啟

show variables like '%query_cache_size%'  --預設值1M

SET GLOBAL query_cache_type = 1; --會報錯           
MySQL基礎一
MySQL基礎一
MySQL基礎一

query_cache_type隻能配置在my.cnf檔案中!

緩存在生産環境建議不開啟,除非經常有sql完全一模一樣的查詢

緩存 嚴格要求2次SQL請求要完全一樣,包括SQL語句,連接配接的資料庫、協定版本、字元集等因素都會影響

從8.0開始,MySQL不再使用查詢緩存,那麼放棄它的原因是什麼呢?

MySQL查詢緩存是查詢結果緩存。它将以SEL開頭的查詢與哈希表進行比較,如果比對,則傳回上一次查詢的結果。進行比對時,查詢必須逐位元組比對,例如 SELECT * FROM e1; 不等于select * from e1;

此外,一些不确定的查詢結果無法被緩存,任何對表的修改都會導緻這些表的所有緩存無效。是以,适用于查詢緩存的最理想的方案是隻讀,特别是需要檢查數百萬行後僅傳回數行的複雜查詢。如果你的查詢符合這樣一個特點,開啟查詢緩存會提升你的查詢性能。

随着技術的進步,經過時間的考驗,MySQL的工程團隊發現啟用緩存的好處并不多。

首先,查詢緩存的效果取決于緩存的命中率,隻有命中緩存的查詢效果才能有改善,是以無法預測其性能。

其次,查詢緩存的另一個大問題是它受到單個互斥鎖的保護。在具有多個核心的伺服器上,大量查詢會導緻大量的互斥鎖争用。

通過基準測試發現,大多數工作負載最好禁用查詢緩存(5.6的預設設定):按照官方所說的:造成的問題比它解決問題要多的多,弊大于利就直接砍掉了。

繼續閱讀