欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

mysql8查詢原理

錢淋西2年前20瀏覽0評論
mysql8查詢原理?

基本步驟為:

1.客戶端發送一條查詢給服務器。

2.服務器先檢查查詢緩存,如果命中了緩存,則立刻返回存儲在緩存中的結果。否則進入下一階段。

3。服務器端進行SQL解析,預處理,再由優化器生成對應的執行計劃

4。MySql根據優化器生成的執行計劃,調用存儲引擎的API執行查詢。

5。返回結果給客戶端。

MySQL客戶端/服務器通信協議

MySQL客戶端和服務器之間的通信協議是“半雙工”的,這意味著,在任何野時刻,要么是由服務器向客戶端發送數據,要么是客戶端向服務器發送數據,這兩個動作不能同時執行。所以,我們無法也無須將也消息切成小塊獨立來發送。

這種協議讓MySQL通信簡單快速,但是也從很多地方限制了MySQL。一端開始發送消息,另一端要接受完整個消息才能響應它。這就像來回拋球的游戲:在任何時刻,只有一個人能控制球,而且只有控球的人才能將球發回去。

相反的,一般服務器響應給用戶的數據通常很多,由多個數據包組成。當服務器開始響應客戶端請求時,客戶端必須完整地接受整個返回結果,而不能簡單地只去前面這個結果,然后讓服務器停止發送。這就是為什么要加Limit

查詢狀態

對于一個MySQL連接,或者說一個線程,任何時刻都有一個狀態,該狀態表示了MySQL當前正在做什么,最簡單是使用SHOW FULLPROCESSLIST命令。在一個查詢的生命周期中,狀態會變化很多次。MySQL官方手冊對這些狀態值的含義最權威的解釋:

Sleep:線程等待客戶端發送新的請求。

Query:線程正在執行查詢或者正在將結果發送給客戶端。

Locked:線程在等待表鎖。等待行鎖時不會出現。

Analyzing and statistics:線程正在收集存儲引擎統計信息,并生成查詢計劃。

Sorting result:線程正在對結果排序。

查詢緩存

在解析SQL語句之前,如果查詢緩存是打開的,MySql會首先檢查這個查詢是否命中緩存中的數據。如果當前的查詢恰好命中了查詢緩存,那么在返回查詢結果之前MySQL會檢查一次用戶權限,如果權限沒問題就會返回,這種情況下查詢不會被解析,不用生成執行計劃,不會被執行。

查詢優化處理

在查詢緩存的下一步是解析SQL,預處理,優化SQL執行計劃。這個過程中任何錯誤都可能終止查詢。

語法解析和預處理

首先MySQL通過關鍵字將SQL語句進行解析,并生成一顆對應的”解析樹”。MySQL解析器將使用MySQL語法規則和解析查詢。

預處理會根據MySQL規則進一步檢查解析樹是否合法。

查詢優化

如果語法樹是被認為是合法的,現在就會通過優化器轉化為執行計劃。

MysQL使用基于成本的優化器,它將嘗試預測一個查詢使用某種執行計劃時的成本,并選擇其中成本最小的一個。

有很多原因會導致MySQL優化器會選擇錯誤執行計劃。

1。統計信息不準確。

2。執行計劃中的成本估算不等同于實際執行的成本。

3。MySQL的最優可能和你想的不一樣

4。MySQL不考慮其他并發執行的查詢

MySQL可以支持的優化類型:

1。重新定義關聯表的順序

2。外連接轉換為內連接

3。使用等價變換規則

4。優化COUNT(),MIN和MAX()——利用索引優化

5。預估轉換為常數表達式

6。覆蓋索引掃描

7。子查詢優化

8。提前終止查詢–LIMIT

9。等值傳播

10。列表in()的比較–不是簡單的or,將其排序并用二分查找的方式來確定列表中的值是否滿足。