MySQL 查詢優化器實驗分析(三)

緊接著之前的《MySQL 查詢優化器實驗分析(二)》中的內容,以下對測試過程進行詳細分析。

1.1測試。

1.1測試。

1.4測試。

類似1.4測試,不同之處在于查詢的where條件中有恒等常量,在優化過程中會調用remove_eq_conds1=1條件刪除。

1.4測試類似,由于where條件查詢有兩個,並且其中一個條件可以通過索引查詢。因此首先通過調用update_ref_and_keys()sql\sql_select.cc:3967)函數,查找可以使用索引的字段。

SQL_SELECT::test_quick_select()1.5索引測試

get_key_scans_params()1.5索引測試。

1.3測試。

1.3測試。

1.5索引測試。

以下操作同1.3測試。

LimitIn

1.1測試。

1.1測試。

1.4測試。

1.4測試。

1.5索引測試類似,不同之處在于調用update_ref_and_keys()sql\sql_select.cc:3967)函數時,查找查詢字段是否可以用索引字段時,沒有找到可以使用的索引。但是由于查詢字段上有索引,因此調用get_quick_record_count()函數的實現邏輯SQL_SELECT::test_quick_select()函數構建查詢樹時,轉化爲OR的方式處理,並將查找的鍵值進行合並,形成查詢範圍。

1.5索引測試

1.5索引測試。

1.3測試。

1.3測試。

1.5測試。盡管查詢字段有索引,但是調用update_ref_and_keys()對查詢字段進行檢查是否可以使用索引時,沒有可以使用的索引。因此,不同于1.5的索引測試的過程,而是與普通查詢測試相同。

以下操作類似1.3測試。不同之處在于查詢的範圍通過搜索查詢樹,減小了查詢的範圍。

INget_quick_record_count()

1.1測試。

1.1測試。

1.4測試。

setup_order()初始化order by列表。根據order by的字段,改變查詢列表中查詢字段的order by順序。並調用find_order_in_list()函數,檢查order by 的字段是否在select的字段中(調用find_item_in_list()(sql\sql_base.cc:6835)),並查找order by列表中的字段是否在數據表中(調用find_item_in_tables()(sql\sql_base.cc:6602))。(sql\sql_select.cc:15037)(sql\sql_select.cc:14996

setup_group()初始化group by列表,處理邏輯跟setup_order()的處理邏輯相同。調用find_order_in_list()函數,檢查group by 的字段是否在select的字段中(調用find_item_in_list()(sql\sql_base.cc:6835)),並查找group by列表中的字段是否在數據表中(調用find_item_in_tables()(sql\sql_base.cc:6602))。(sql\sql_select.cc:15037)(sql\sql_select.cc:14996

having處理:having的初始化過程沒有以具體的函數形式給出,但是處理邏輯類似group by。主要檢查having條件的字段是否在查詢列表中。由于having條件是查詢字段的別名,因此在比較了查詢列表後,發現該字段即結束。

類似1.4測試,但不同之處在于進行優化的是having條件。

1.3轉化爲group by後的測試類似。

1.3測試。

1.3測試。

1.3測試。

1.3測試。

1.3測試。

以下操作同1.3測試類似,區別在于對臨時表操作時,臨時結果的過濾方式不同。生成臨時結果的過程中,會調用聚合函數進行處理。

Union

Union條件處理邏輯。調用st_select_lex_unit::prepare()函數(sql\sql_union.cc:1172)對Union中的每條語句進行處理。

逐條執行JOIN:prepare()處理邏輯,爲查詢處理做准備工作,並調用select_union::create_result_table()sql\sql_union.cc:117)函數創建臨時表。

主要處理過程同1.4測試。

逐條執行JOIN:optimize()處理邏輯,對每條查詢語句進行優化。逐條執行JOIN:exec()處理邏輯,執行查詢操作。

對于Union中的不同查詢字段類型的語句,處理邏輯有所不同。Union的第一句的處理邏輯同1.4主鍵查詢測試。Union的第二句的處理邏輯同1.5測試的索引字段處理。Union的第三句的處理邏輯同1.5測試的普通字段處理。

不同的Union中不同查詢字段類型的語句,處理邏輯不同,並將查詢的結果存儲到臨時表中。同JOIN:optimize階段的對應關系相同。

構建一條查詢語句,獲取查詢結果。

1.1測試,獲取查詢結果。

接下來的測試將在接下來的《MySQL 查詢優化器實驗分析(四)》文檔中給出。

更多相關文章
  • 緊接著之前的<MySQL 查詢優化器實驗分析(三)>中的內容,以下對測試過程進行詳細分析.將在接下來的<MySQL 查詢優化器實驗分析(五)>文檔中給出.
  •          基于之前對MySQL查詢優化器的源碼進行分析,對MySQL查詢優化器的處理邏輯和工作原理有較深入的了解.然而,僅僅通過源碼表象並不能清晰的了解MySQL查詢優化器針對不同的SQL查詢,所進行的邏輯處理.因此,爲了進一步了解不同的SQL查詢,查詢優化器的優化過程,進行了一系列的SQL ...
  • 緊接著之前的<MySQL 查詢優化器實驗分析(五)>中的內容,以下對測試過程進行詳細分析.
  • 緊接著之前的<MySQL 查詢優化器實驗分析(四)>中的內容,以下對測試過程進行詳細分析.2.5 LEFT JOIN查詢       該測試主要用于測試LEFT JOIN與JOIN的處理邏輯上的差異,具體查詢處理邏輯如下所示: JOIN:prepare階段setup_tables():同 ...
  • MySQL查詢優化器源碼分析
    目的基于之前出現的主從庫分別執行相同語句,查詢計劃和執行時間不同的問題.通過對源代碼跟蹤和調試,對MySQL的查詢優化器進行分析並編寫文檔,爲開發人員和數據庫管理人員提供查詢SQL語句的建議. 基礎MySQL的設計架構在官方文檔中給出,如下圖所示.該圖的具體描述和講解,請參考官方文檔或地址:http ...
  •        一.MySQL 查詢優化器是如何工作的        MySQL 查詢優化器有幾個目標,但是其中最主要的目標是盡可能地使用索引,並且使用最嚴格的索引來消除盡可能多的數據行.最終目標是提交 SELECT 語句查找數據行,而不是排除數據行.優化器試圖排除數據行的原因在于它排除數據行的速度越 ...
  • 查詢優化器內核剖析第一篇查詢優化器內核剖析第二篇:産生候選執行計劃&執行計劃成本估算查詢優化器內核剖析第三篇:查詢的執行與計劃的緩存 & Hint提示 查詢優化器內核剖析第四篇:從一個實例看執行計劃   
  • 查詢優化器內核剖析第一篇查詢優化器內核剖析第二篇:産生候選執行計劃&執行計劃成本估算查詢優化器內核剖析第三篇:查詢的執行與計劃的緩存 & Hint提示  查詢優化器內核剖析第四篇:從一個實例看執行計劃   查詢優化器內核剖析第五篇:進一步的了解執行計劃 查詢優化器內核剖析第七篇:執行 ...
一周排行
  • 謹慎覆蓋Clone
        假設現在有個需求:一個對象A,在某一時刻A中已包含了一些有效值,此時可能需要一個和 ...
  • 關于兩個世界體系的對話
    習慣經驗的強大慣性,源自于背景的長期穩定性.軟件體系的快速變革,讓我們忽視了硬件體系的長期 ...
  • Node.js基礎入門實例講解
    日期:-4  來源:GBin1.com 事件驅動的編程對于初學者來說可能有點兒 ...
  • Android實戰簡易教程-第五十八槍AlarmManager類用法研究小實例
    一.概念及相關方法android中實現定時任務一般有兩種實現方式,一種是使用Java AP ...
  • ThinkPad設置無線熱點
                                              關于W ...
  • Tomcat下中文亂碼問題的解決思路
    現在將常見的亂碼問題分爲JSP頁面顯示中文亂碼.表單提交亂碼兩類.      1)JSP頁 ...
  • 下面對SIP協定産生NAT穿透問題,作一些解釋:及提出解決的辦法. 1.大致有4種類型的NAT.a) Full Cone 完全圓錐體b) restricted cone 受限制的圓錐體c) port restrict ...
  •     函數創建兩種方式:        function name { command; }        name () { command; }    在shell中創建的variable默認都全局變量,在函數 ...
  • 以下交換機都是指的純二層交換機.  1. 同一個vlan內的兩個機器,如果其IP不在一個網段,那麽能相互連通嗎?答案是,二層是連通的,三層則不通.具體表現就是通過netbui可以看到對方,但是卻不能ping通對方.因 ...
  • 1 問題描述: 啓動nginx服務時出現:Nginx [emerge] :bind() to 0.0.0.8 failed (98: Address already in use) 2 問題解決:     使用 ...