日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL探秘(二):SQL语句执行过程详解

發布時間:2024/4/18 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL探秘(二):SQL语句执行过程详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

只有更加全面地了解SQL語句執行的每個過程,才能更好的進行SQL的設計和優化。
?當希望MySQL能夠以更高的性能運行查詢時,最好的辦法就是弄清楚MySQL是如何優化和執行查詢的。一旦理解了這一點,很多查詢優化工作實際上就是遵循一些原則能夠按照預想的合理的方式運行。
?如下圖所示,當向MySQL發送一個請求的時候,MySQL到底做了什么:

  • 客戶端發送一條查詢給服務器。
  • 服務器先檢查查詢緩存,如果命中了緩存,則立刻返回存儲在緩存中的結果。否則進入下一階段。
  • 服務器端進行SQL解析、預處理,再由優化器生成對應的執行計劃。
  • MySQL根據優化器生成的執行計劃,再調用存儲引擎的API來執行查詢。
  • 將結果返回給客戶端。
  • 查詢緩存

    ?MySQL查詢緩存保存查詢返回的完整結構。當查詢命中該緩存時,MySQL會立刻返回結果,跳過了解析、優化和執行階段。
    ?查詢緩存系統會跟蹤查詢中涉及的每個表,如果這些表發生了變化,那么和這個表相關的所有緩存數據都將失效。
    ?MySQL將緩存存放在一個引用表中,通過一個哈希值引用,這個哈希值包括了以下因素,即查詢本身、當前要查詢的數據庫、客戶端協議的版本等一些其他可能影響返回結果的信息。
    ?當判斷緩存是否命中時,MySQL不會進行解析查詢語句,而是直接使用SQL語句和客戶端發送過來的其他原始信息。所以,任何字符上的不同,例如空格、注解等都會導致緩存的不命中。
    ?當查詢語句中有一些不確定的數據時,則不會被緩存。例如包含函數NOW()或者CURRENT_DATE()的查詢不會緩存。包含任何用戶自定義函數,存儲函數,用戶變量,臨時表,mysql數據庫中的系統表或者包含任何列級別權限的表,都不會被緩存。
    ?有一點需要注意,MySQL并不是會因為查詢中包含一個不確定的函數而不檢查查詢緩存,因為檢查查詢緩存之前,MySQL不會解析查詢語句,所以也無法知道語句中是否有不確定的函數。
    ?事實則是,如果查詢語句中包含任何的不確定的函數,那么其查詢結果不會被緩存,因為查詢緩存中也無法找到對應的緩存結果。
    ?

    有關查詢緩存的配置如下所示:

    query_cache_type:是否打開查詢緩存。可以設置為OFF、ON和DEMAND。DEMAND表示只有在查詢語句中明確寫明SQL_CACHE的語句才會放入查詢緩存。
    query_cache_size:查詢緩存使用的總內存空間。
    query_cache_min_res_unit:在查詢緩存中分配內存塊時的最小單元。較小的該值可以減少碎片導致的內存空間浪費,但是會導致更頻繁的內存塊操作。
    query_cache_limit:MySQL能夠查詢的最大查詢結果。如果查詢結果大于這個值,則不會被緩存。因為查詢緩存在數據生成的時候就開始嘗試緩存數據,所以當結果全部返回后,MySQL才知道查詢結果是否超出限制。超出之后,才會將結果從查詢緩存中刪除。

    對查詢緩存的優化是數據庫性能優化的重要一環。判斷流程大致如下圖所示。

    ?緩存命中率可以通過如下公式計算:Qcache_hits/(Qcache_hits + Com_select)來計算。

    解析和預處理

    ?解析器通過關鍵字將SQL語句進行解析,并生成對應的解析樹。MySQL解析器將使用MySQL語法規則驗證和解析查詢。
    ?預處理器則根據一些MySQL規則進行進一步檢查解析樹是否合法,例如檢查數據表和數據列是否存在,還會解析名字和別名,看看它們是否有歧義。

    查詢優化器

    ?查詢優化器會將解析樹轉化成執行計劃。一條查詢可以有多種執行方法,最后都是返回相同結果。優化器的作用就是找到這其中最好的執行計劃。
    ?生成執行計劃的過程會消耗較多的時間,特別是存在許多可選的執行計劃時。如果在一條SQL語句執行的過程中將該語句對應的最終執行計劃進行緩存,當相似的語句再次被輸入服務器時,就可以直接使用已緩存的執行計劃,從而跳過SQL語句生成執行計劃的整個過程,進而可以提高語句的執行速度。

    ?MySQL使用基于成本的查詢優化器(Cost-Based Optimizer,CBO)。它會嘗試預測一個查詢使用某種執行計劃時的成本,并選擇其中成本最少的一個。
    ?優化器會根據優化規則對關系表達式進行轉換,這里的轉換是說一個關系表達式經過優化規則后會生成另外一個關系表達式,同時原有表達式也會保留,經過一系列轉換后會生成多個執行計劃,然后CBO會根據統計信息和代價模型(Cost Model)計算每個執行計劃的Cost,從中挑選Cost最小的執行計劃。由上可知,CBO中有兩個依賴:統計信息和代價模型。統計信息的準確與否、代價模型的合理與否都會影響CBO選擇最優計劃。
    ?有關優化器的原理十分復雜,這里就不進行詳細講解了,大家可以自行學習。

    查詢執行引擎

    ?在解析和優化階段,MySQL將生成查詢對應的執行計劃,MySQL的查詢執行引擎根據這個執行計劃來完成整個查詢。這里執行計劃是一個數據結構,而不是和其他的關系型數據庫那樣生成對應的字節碼。

    返回結果給客戶端

    ?如果查詢可以被緩存,那么MySQL在這個階段也會將結果存放到查詢緩存中。
    ?MySQL將結果集返回給客戶端是一個增量、逐步返回的過程。在查詢生成第一條結果時,MySQL就可以開始向客戶端逐步返回結果集了。
    ?

    總結

    以上是生活随笔為你收集整理的MySQL探秘(二):SQL语句执行过程详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。