成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL源碼解析之執行計劃

數據庫 MySQL
MySQL的執行計劃是整個數據庫最核心的模塊,其代碼也在不斷地迭代更新過程中。執行計劃中優化器的好壞和背后的搜索策略、數學模型緊密相關。MySQL支持的搜索策略有窮舉搜索、貪婪搜索,對應的Join優化器有左深樹算法和超圖算法,整個優化過程主要是基于CBO策略進行優化。

一、MySQL執行計劃介紹

在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執行計劃代碼概覽

本文主要基于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的執行計劃是整個數據庫最核心的模塊,其代碼也在不斷地迭代更新過程中。執行計劃中優化器的好壞和背后的搜索策略、數學模型緊密相關。MySQL支持的搜索策略有窮舉搜索、貪婪搜索,對應的Join優化器有左深樹算法和超圖算法,整個優化過程主要是基于CBO策略進行優化。

執行計劃運行的過程,實際上就是一個動態規劃的過程。這個過程的優劣,快慢決定了MySQL和主流商業數據庫的差距。只有深入地理解MySQL優化器的運行原理,才能幫助我們積極有效地探索更高性能優化的可能。 

責任編輯:武曉燕 來源: GreatSQL社區
相關推薦

2011-09-14 17:03:17

數據庫執行計劃解析

2023-09-21 10:55:51

MysqlSQL語句

2021-05-28 10:46:36

MySQL執行計劃

2024-09-12 15:16:14

2020-09-15 08:44:57

MySQL慢日志SQL

2021-04-24 12:01:08

MySQL數據庫Mysql執行計劃

2015-04-22 14:17:45

SQL SERVERMSSQL SERVE緩沖區

2021-03-17 09:35:51

MySQL數據庫explain

2022-02-15 07:36:21

SQLEXPLAIN數據庫

2018-02-27 14:00:35

數據庫MySQL統計信息

2017-11-15 08:50:59

數據庫MySQL

2009-11-13 16:28:02

Oracle生成執行計

2010-04-16 09:27:18

Ocacle執行計劃

2021-02-20 08:40:19

HiveExplain底層

2009-11-18 17:05:47

捕獲Oracle SQ

2022-08-15 15:09:26

SQL數據庫MySQL

2009-11-10 16:00:05

Oracle執行計劃

2021-09-07 10:43:25

EverDB分布式執行

2022-12-13 08:36:42

D-SMARTOracle數據庫

2024-04-19 13:17:40

PostgreSQLSQL數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天拍天天操 | 亚洲一区精品在线 | 久久成人一区 | 亚洲综合久久精品 | 国产日韩精品一区 | 99久热在线精品视频观看 | 精品一区二区三区免费视频 | 91porn国产成人福利 | 国产日韩欧美精品一区二区三区 | 干一干操一操 | 国产91亚洲精品 | 亚洲欧洲成人 | 精品国产91 | 中文字幕 在线观看 | 欧美一区二区久久 | 91精品国产乱码久久蜜臀 | 仙人掌旅馆在线观看 | 国产精品久久久久久久久久 | 久久久91精品国产一区二区三区 | 国产一区久久 | 欧美成人h版在线观看 | 欧美二区在线 | 色婷婷综合网站 | 免费在线一区二区 | 日本免费一区二区三区 | 综合色在线| 日韩毛片视频 | 欧洲亚洲一区二区三区 | 国产高清在线精品 | 国产精品九九九 | 成人av在线播放 | 婷婷五月色综合 | 呦呦在线视频 | 日本理论片好看理论片 | 午夜小视频在线播放 | 91视频88av| 国产成视频在线观看 | 国产美女一区二区三区 | 欧美理论片在线观看 | 99精品久久久国产一区二区三 | 国产在线视频一区二区董小宛性色 |