<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在MySQL中,執行計劃的實現是基於JOIN和QEP_TAB這兩個物件。其中JOIN類表示一個查詢語句塊的優化和執行,每個select查詢語句(即Query_block物件)在處理的時候,都會被當做JOIN物件,其定義在sql/sql_optimizer.h。
QEP_TAB是Query Execution Plan Table的縮寫,這裡的表Table物件主要包含物化表、臨時表、派生表、常數表等。JOIN::optimize()是優化執行器的統一入口,在這裡會把一個查詢語句塊Query_block最終優化成QEP_TAB。
在MySQL-8.0.22版本之後,又引入存取方式AccessPath和執行迭代器Iterator物件,再結合JOIN和QEP_TAB物件,最終得到整個解析計劃的執行路徑。
本文主要基於MySQL-8.0.25版本,進行說明。
優化器的入口函數:bool JOIN::optimize(),對應程式碼檔案sql/sql_optimizer.cc。
// 主要功能是把一個查詢塊Query_block優化成一個QEP_TAB,得到AccessPath bool JOIN::optimize() { ... // 下面主要是為了可以藉助INFORMATION_SCHEMA.OPTIMIZER_TRACE表,跟蹤優化器的執行狀態和執行步驟 Opt_trace_context *const trace = &thd->opt_trace; Opt_trace_object trace_wrapper(trace); Opt_trace_object trace_optimize(trace, "join_optimization"); trace_optimize.add_select_number(Query_block->select_number); Opt_trace_array trace_steps(trace, "steps"); ... // 視窗函數裝配優化 if (has_windows && Window::setup_windows2(thd, m_windows)) ... // 拷貝Query_block上的條件副本到JOIN結構關聯的成員物件,為後續優化做準備 if (Query_block->get_optimizable_conditions(thd, &where_cond, &having_cond)) ... // 統計抽象語法樹中的葉節點表,其中leaf_tables是在Query_block::setup_tables中進行裝配 tables_list = Query_block->leaf_tables; ... // 分割區裁剪 if (Query_block->partitioned_table_count && prune_table_partitions()) { ... // 嘗試把聚合函數COUNT()、MIN()、MAX()對應的值,替換成常數 if (optimize_aggregated_query(thd, Query_block, *fields, where_cond, &outcome)) { ... // 採用超圖演演算法生成執行計劃,注意超圖演演算法通過set optimizer_switch="hypergraph_optimizer=on"方式啟用 if (thd->lex->using_hypergraph_optimizer) { FindBestQueryPlan(thd, Query_block, /*trace=*/nullptr); // 如果Join優化器是超圖演演算法,處理結束直接返回 return false; } ...
下面程式碼主要涉及Join優化器連線方式為左深樹的情況,主要用到join_tab陣列來進行組織關聯
根據代價計算表的連線方式,核心函數make_join_plan(),實現非常複雜。比較關鍵的函數是bool Optimize_table_order::choose_table_order()
其主要思想是通過貪婪搜尋Optimize_table_order::greedy_search,根據最小的連線代價,進行有限的窮舉搜尋(細節參考Optimize_table_order::best_extension_by_limited_search)
最終找到近似最優解的連線排列組合
if (make_join_plan()) { ... // 語句塊謂詞條件下推,提升過濾效能 if (make_join_Query_block(this, where_cond)) { ... // 優化order by/distinct語句 if (optimize_distinct_group_order()) return true; ... // 分配QEP_TAB陣列 if (alloc_qep(tables)) return (error = 1); /* purecov: inspected */ ... // 執行計劃細化,優化子查詢和半連線的情況,具體策略可以參考mariadb的檔案: // https:// mariadb.com/kb/en/optimization-strategies/ // 關鍵程式碼是setup_semijoin_dups_elimination,主要對半連線關聯的策略進行裝配 if (make_join_readinfo(this, no_jbuf_after)) ... // 為處理group by/order by建立開闢臨時表空間 if (make_tmp_tables_info()) return true; ... // 生成存取方式AccessPath,供後續迭代器Iterator存取使用 create_access_paths(); ... return false; }
MySQL的執行計劃是整個資料庫最核心的模組,其程式碼也在不斷地迭代更新過程中。執行計劃中優化器的好壞和背後的搜尋策略、數學模型緊密相關。MySQL支援的搜尋策略有窮舉搜尋、貪婪搜尋,對應的Join優化器有左深樹演演算法和超圖演演算法,整個優化過程主要是基於CBO策略進行優化。
執行計劃執行的過程,實際上就是一個動態規劃的過程。這個過程的優劣,快慢決定了MySQL和主流商業資料庫的差距。只有深入地理解MySQL優化器的執行原理,才能幫助我們積極有效地探索更高效能優化的可能。
最後由於筆者知識水平有限,疏漏之處,還望斧正。
到此這篇關於MySQL執行計劃詳解的文章就介紹到這了,更多相關MySQL執行計劃內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45