欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    MySQL源碼解析之執(zhí)行計(jì)劃一、MySQL執(zhí)行計(jì)劃介紹

    在MySQL中,執(zhí)行計(jì)劃的實(shí)現(xiàn)是基于JOIN和這兩個(gè)對象。其中JOIN類表示一個(gè)查詢語句塊的優(yōu)化和執(zhí)行,每個(gè)查詢語句(即對象)在處理的時(shí)候,都會被當(dāng)做JOIN對象,其定義在sql/.h。

    是Query Plan Table的縮寫,這里的表Table對象主要包含物化表、臨時(shí)表、派生表、常量表等。JOIN::()是優(yōu)化執(zhí)行器的統(tǒng)一入口,在這里會把一個(gè)查詢語句塊最終優(yōu)化成。

    在MySQL-8.0.22版本之后,又引入訪問方式和執(zhí)行迭代器對象,再結(jié)合JOIN和對象mysql數(shù)據(jù)庫執(zhí)行計(jì)劃,最終得到整個(gè)解析計(jì)劃的執(zhí)行路徑。

    二、MySQL執(zhí)行計(jì)劃代碼概覽

    本文主要基于MySQL-8.0.25版本,進(jìn)行說明。

    優(yōu)化器的入口函數(shù):bool JOIN::(),對應(yīng)代碼文件sql/。

    // 主要功能是把一個(gè)查詢塊Query_block優(yōu)化成一個(gè)QEP_TAB,得到AccessPath
    bool JOIN::optimize() { 
        ...
        // 下面主要是為了可以借助INFORMATION_SCHEMA.OPTIMIZER_TRACE表,跟蹤優(yōu)化器的執(zhí)行狀態(tài)和執(zhí)行步驟
        Opt_trace_context *const trace = &thd->opt_trace;
    

    mysql 動(dòng)態(tài)執(zhí)行sql_mysql定時(shí)任務(wù)沒有執(zhí)行_mysql數(shù)據(jù)庫執(zhí)行計(jì)劃

    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"); ... // 窗口函數(shù)裝配優(yōu)化 if (has_windows && Window::setup_windows2(thd, m_windows)) ... // 拷貝Query_block上的條件副本到JOIN結(jié)構(gòu)關(guān)聯(lián)的成員對象,為后續(xù)優(yōu)化做準(zhǔn)備 if (Query_block->get_optimizable_conditions(thd, &where_cond, &having_cond)) ... // 統(tǒng)計(jì)抽象語法樹中的葉節(jié)點(diǎn)表,其中l(wèi)eaf_tables是在Query_block::setup_tables中進(jìn)行裝配

    mysql 動(dòng)態(tài)執(zhí)行sql_mysql數(shù)據(jù)庫執(zhí)行計(jì)劃_mysql定時(shí)任務(wù)沒有執(zhí)行

    tables_list = Query_block->leaf_tables; ... // 分區(qū)裁剪 if (Query_block->partitioned_table_count && prune_table_partitions()) { ... // 嘗試把聚合函數(shù)COUNT()、MIN()、MAX()對應(yīng)的值,替換成常量 if (optimize_aggregated_query(thd, Query_block, *fields, where_cond, &outcome)) { ... // 采用超圖算法生成執(zhí)行計(jì)劃,注意超圖算法通過set optimizer_switch="hypergraph_optimizer=on"方式啟用 if (thd->lex->using_hypergraph_optimizer) { FindBestQueryPlan(thd, Query_block, /*trace=*/nullptr);

    mysql數(shù)據(jù)庫執(zhí)行計(jì)劃_mysql定時(shí)任務(wù)沒有執(zhí)行_mysql 動(dòng)態(tài)執(zhí)行sql

    // 如果Join優(yōu)化器是超圖算法,處理結(jié)束直接返回 return false; } ...

    下面代碼主要涉及Join優(yōu)化器連接方式為左深樹的情況,主要用到數(shù)組來進(jìn)行組織關(guān)聯(lián)

    根據(jù)代價(jià)計(jì)算表的連接方式,核心函數(shù)(),實(shí)現(xiàn)非常復(fù)雜。比較關(guān)鍵的函數(shù)是bool ::()

    其主要思想是通過貪婪搜索::,根據(jù)最小的連接代價(jià),進(jìn)行有限的窮舉搜索(細(xì)節(jié)參考::)

    最終找到近似最優(yōu)解的連接排列組合

        if (make_join_plan()) {
        ...
        // 語句塊謂詞條件下推,提升過濾性能
        if (make_join_Query_block(this, where_cond)) {
    

    mysql 動(dòng)態(tài)執(zhí)行sql_mysql數(shù)據(jù)庫執(zhí)行計(jì)劃_mysql定時(shí)任務(wù)沒有執(zhí)行

    ... // 優(yōu)化order by/distinct語句 if (optimize_distinct_group_order()) return true; ... // 分配QEP_TAB數(shù)組 if (alloc_qep(tables)) return (error = 1); /* purecov: inspected */ ... // 執(zhí)行計(jì)劃細(xì)化,優(yōu)化子查詢和半連接的情況,具體策略可以參考mariadb的文檔: // https:// mariadb.com/kb/en/optimization-strategies/ // 關(guān)鍵代碼是setup_semijoin_dups_elimination,主要對半連接關(guān)聯(lián)的策略進(jìn)行裝配 if (make_join_readinfo(this, no_jbuf_after)) ...

    mysql定時(shí)任務(wù)沒有執(zhí)行_mysql數(shù)據(jù)庫執(zhí)行計(jì)劃_mysql 動(dòng)態(tài)執(zhí)行sql

    // 為處理group by/order by創(chuàng)建開辟臨時(shí)表空間 if (make_tmp_tables_info()) return true; ... // 生成訪問方式AccessPath,供后續(xù)迭代器Iterator訪問使用 create_access_paths(); ... return false; }

    三、MySQL執(zhí)行計(jì)劃總結(jié)

    MySQL的執(zhí)行計(jì)劃是整個(gè)數(shù)據(jù)庫最核心的模塊,其代碼也在不斷地迭代更新過程中。執(zhí)行計(jì)劃中優(yōu)化器的好壞和背后的搜索策略、數(shù)學(xué)模型緊密相關(guān)。MySQL支持的搜索策略有窮舉搜索、貪婪搜索mysql數(shù)據(jù)庫執(zhí)行計(jì)劃,對應(yīng)的Join優(yōu)化器有左深樹算法和超圖算法,整個(gè)優(yōu)化過程主要是基于CBO策略進(jìn)行優(yōu)化。

    執(zhí)行計(jì)劃運(yùn)行的過程,實(shí)際上就是一個(gè)動(dòng)態(tài)規(guī)劃的過程。這個(gè)過程的優(yōu)劣,快慢決定了MySQL和主流商業(yè)數(shù)據(jù)庫的差距。只有深入地理解MySQL優(yōu)化器的運(yùn)行原理,才能幫助我們積極有效地探索更高性能優(yōu)化的可能。

    最后由于筆者知識水平有限,疏漏之處,還望斧正。

    Enjoy :)

網(wǎng)站首頁   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權(quán)所有