91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL查詢語句的執行過程是什么

發布時間:2021-03-24 11:32:26 來源:億速云 閱讀:226 作者:小新 欄目:開發技術

這篇文章主要介紹MySQL查詢語句的執行過程是什么,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

首先先簡單的將一個查詢語句背后MySQL做了什么捋一捋:

  • 客戶端發送一條查詢給服務器

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

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

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

  • 將結果返回給客戶端。

MySQL查詢語句的執行過程是什么

接著我們就將這個過程中的這些步驟詳細的進行展開。

1.客戶端和服務器端之間的通信方式

客戶端和服務器之間的通信是一種半雙工的通信,即在同一時刻,只能有一方向另一方發送數據。所以客戶端在發送完查詢請求之后,所能做的就是等待服務器將查詢的結果返回,并且需要一直地等到返回的數據全部接收完畢后才能進行下一步的操作,而不可以在服務器發送的過程中中斷發送或者斷開連接。

2.查詢緩存

在解析一個查詢語句之前,如果查詢緩存是打開著的,那么MySQL會優先檢查這個查詢是否命中查詢緩存中的數據。這個檢查是通過一個對大小寫敏感的哈希表來實現的。在查詢命中緩存的情況下,直接從緩存中拿到結果并返回給客戶端。MySQL不會再執行下面的操作,即查詢語句不會被解析,不會生成執行計劃,不會被執行。

3.查詢優化處理

這個環節可能是整個查詢執行過程中最為復雜的一個環節,可以分為解析SQL,預處理和優化SQL執行計劃三個步驟。

(1)語法解析器和預處理
這個過程就是對我們傳入的SQL語句的語法進行檢查,以及驗證查詢的權限。炳輝生成一棵“解析樹”。

(2)查詢優化器
在進入到這一步時,證明我們的語句語法層面已經沒有問題了。一條查詢可以有很多種執行計劃都能返回正確的結果,這個環節就是來選取最優的執行計劃的。
MySQL的最優執行計劃是基于成本的。MySQL會為每個操作設定一個成本(如執行一次where比較),并從所有的執行計劃中選擇“成本”最少的。
我們可以使用下列語句查看上一個查詢操作的成本:

mysql> SHOW STATUS LIKE 'last_query_cost';

MySQL會返回一個執行的成本數據:

+-----------------+----------+
| Variable_name  | Value  |
+-----------------+----------+
| Last_query_cost | 0.549000 |
+-----------------+----------+

但值得注意的是,這里的“成本”最小并不等于查詢的速度最快。即以“成本”來判斷查詢語句的優劣有時候是不可靠的。

優化器的優化策略可以大致地分為兩種:靜態優化和動態優化。

靜態優化是直接對之前生成的解析樹進行分析,例如可以通過一些代數變換將where條件轉化為另一種等價形式。靜態優化在第一次完成后就一直生效,即使使用不同的參數重復執行查詢也不會發生變化,可以認為是一種“編譯(預處理)時優化”。

動態優化和查詢的上下文相關,需要在每一次查詢的時候重新評估,可以認為是一種“運行時優化”。

下面是一些MySQL能夠處理的優化類型:

  • 重新定義關聯表的順序

有時候我們所給的查詢語句關聯表的順序可能對于查詢來說效率并不是最優的,這時候MySQL可以自動幫我們將關聯表的順序進行調整提高效率。

  • 將外連接轉化為內連接

并不是所有的OUT JOIN語句都必須以外連接的方式執行。MySQL能夠識別這一點并重寫查詢,讓其可以調整關聯順序。

  • 使用等價變換規則

使用一些等價的語句來減少比較的次數,移除一些恒成立和不恒成立的條件。例如,(5=5 AND a>5)會被改寫為a>5;如果有(a5 AND b=c AND a=5。

  • 優化COUNT()、MIN()和MAX()

索引和列是否為空可以幫助優化這一類表達式。例如查找最小值的時候就可以借助索引直接查找最左端的記錄,這樣就不用進行整個表的查詢,而是以一個常數進行取代。

  • 覆蓋索引掃描

當索引中的列包含所有查詢中需要使用的列的時候,MySQL就會使用索引返回所需要的數據,而無須查詢對應的數據行。

  • 提前終止查詢

在發現查詢已經能滿足需求的時候,MySQL總能立刻終止查詢。一個典型的例子就是當使用了LIMIT子句的時候。

至此,MySQL服務器層已經根據所給的查詢語句給出了一個最優的執行計劃。但是我們需要知道的是,我們到目前為止所進行的一些列的操作都是在服務器層進行的,而這一層中并不是數據存儲的地方。因此接下來我們需要拿著我們的最優執行計劃去到實際的存儲引擎中進行查找。因此就引出了我們的下一步操作:向存儲引擎獲取相應的統計信息。

4.查詢執行引擎

相對于查詢優化階段,查詢執行階段并不是那么復雜。MySQL只是簡單地根據執行計劃給出的指令逐步執行。

5.返回結果給客戶端

查詢執行的最后一個階段是將結果返回給客戶端,即使查詢不需要返回結果集給客戶端,MySQL仍然會返回這個查詢的一些信息,例如查詢影響的行數。
如果查詢可以被緩存,這個階段MySQL會講查詢的結果放到查詢緩存中。
返回結果的過程是一個逐步增量的過程。即當拿到第一個結果的時候就開始向客戶端返回了。這樣做的好處是不會一次性返回全部數據導致占用內存過多,而且客戶端也能在第一時間拿到結果。結果集中的每一行都會以一個滿足MySQL客戶端/服務器通信協議的封包發送,再通過TCP協議進行傳輸,在TCP傳輸的過程中,可能對封包進行緩存后再批量發傳輸。

以上是“MySQL查詢語句的執行過程是什么”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

衡东县| 平罗县| 西丰县| 武冈市| 嘉鱼县| 昭平县| 离岛区| 北宁市| 和林格尔县| 南城县| 海门市| 丘北县| 彭泽县| 长岛县| 鄂托克旗| 鱼台县| 固始县| 大英县| 潮安县| 鹤峰县| 武汉市| 绥滨县| 丰宁| 从江县| 富平县| 莱西市| 昌都县| 大田县| 荥阳市| 界首市| 永春县| 宣威市| 庄浪县| 丰镇市| 乌拉特前旗| 秀山| 盘山县| 分宜县| 黑河市| 长岛县| 寻乌县|