最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL執(zhí)行計(jì)劃詳解

 更新時(shí)間:2022年09月28日 08:49:01   投稿:hebedich  
給大家?guī)?lái)了關(guān)于mysql的相關(guān)知識(shí),主要介紹了從Mysql源碼中分析執(zhí)行計(jì)劃,從而知道MySQL是如何處理你的SQL語(yǔ)句的,分析你的查詢語(yǔ)句或是表結(jié)構(gòu)的性能瓶頸,需要的朋友可以參考下

一、MySQL執(zhí)行計(jì)劃介紹

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

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

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

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

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

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

// 主要功能是把一個(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;
?? ?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)的成員對(duì)象,為后續(xù)優(yōu)化做準(zhǔn)備
?? ?if (Query_block->get_optimizable_conditions(thd, &where_cond, &having_cond))
?? ?...
?? ?// 統(tǒng)計(jì)抽象語(yǔ)法樹(shù)中的葉節(jié)點(diǎn)表,其中l(wèi)eaf_tables是在Query_block::setup_tables中進(jìn)行裝配
?? ?tables_list = Query_block->leaf_tables;
?? ?...
?? ?// 分區(qū)裁剪
?? ?if (Query_block->partitioned_table_count && prune_table_partitions()) {
?? ?...
?? ?// 嘗試把聚合函數(shù)COUNT()、MIN()、MAX()對(duì)應(yīng)的值,替換成常量
?? ?if (optimize_aggregated_query(thd, Query_block, *fields, where_cond,
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?&outcome)) {
?? ?...
?? ?// 采用超圖算法生成執(zhí)行計(jì)劃,注意超圖算法通過(guò)set optimizer_switch="hypergraph_optimizer=on"方式啟用
?? ?if (thd->lex->using_hypergraph_optimizer) {
?? ??? ?FindBestQueryPlan(thd, Query_block, /*trace=*/nullptr);
?? ??? ?// 如果Join優(yōu)化器是超圖算法,處理結(jié)束直接返回
?? ??? ?return false;
?? ?}
?? ?...

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

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

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

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

?? ?if (make_join_plan()) {
?? ?...
?? ?// 語(yǔ)句塊謂詞條件下推,提升過(guò)濾性能
?? ?if (make_join_Query_block(this, where_cond)) {
?? ?...
?? ?// 優(yōu)化order by/distinct語(yǔ)句
?? ?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,主要對(duì)半連接關(guān)聯(lián)的策略進(jìn)行裝配
?? ?if (make_join_readinfo(this, no_jbuf_after))
?? ?...
?? ?// 為處理group by/order by創(chuàng)建開(kāi)辟臨時(shí)表空間
?? ?if (make_tmp_tables_info()) return true;
?? ?...
?? ?// 生成訪問(wèn)方式AccessPath,供后續(xù)迭代器Iterator訪問(wèn)使用
?? ?create_access_paths();
?? ?...
?? ?return false;
}

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

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

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

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

到此這篇關(guān)于MySQL執(zhí)行計(jì)劃詳解的文章就介紹到這了,更多相關(guān)MySQL執(zhí)行計(jì)劃內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL查詢性能優(yōu)化索引下推

    MySQL查詢性能優(yōu)化索引下推

    這篇文章主要介紹了MySQL查詢性能優(yōu)化索引下推,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-08-08
  • MySQL?SELECT數(shù)據(jù)查看WHERE(AND?OR?IN?NOT)語(yǔ)句

    MySQL?SELECT數(shù)據(jù)查看WHERE(AND?OR?IN?NOT)語(yǔ)句

    這篇文章主要介紹了MySQL?SELECT數(shù)據(jù)查看WHERE(AND?OR?IN?NOT)de?語(yǔ)句學(xué)習(xí),非常適合新手小白朋友,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 一篇文章帶你了解SQL之CASE WHEN用法詳解

    一篇文章帶你了解SQL之CASE WHEN用法詳解

    本文介紹下,在mysql數(shù)據(jù)庫(kù)中,有關(guān)case when語(yǔ)句的用法,介紹了case when語(yǔ)句的基礎(chǔ)知識(shí),并提供了相關(guān)實(shí)例,供大家學(xué)習(xí)參考,有需要的朋友不要錯(cuò)過(guò)
    2021-08-08
  • 在Windows上使用ZIP包安裝MySQL的詳細(xì)步驟

    在Windows上使用ZIP包安裝MySQL的詳細(xì)步驟

    本文詳細(xì)介紹了在Windows上使用官方ZIP包安裝MySQL的步驟,包括下載、解壓、配置環(huán)境變量、創(chuàng)建配置文件、初始化MySQL、安裝服務(wù)、啟動(dòng)服務(wù)、登錄并修改root密碼以及驗(yàn)證連接,需要的朋友可以參考下
    2025-02-02
  • MySQL中字符串函數(shù)詳細(xì)介紹

    MySQL中字符串函數(shù)詳細(xì)介紹

    通常以串的整體作為操作對(duì)象,如:在串中查找某個(gè)子串、求取一個(gè)子串、在串的某個(gè)位置上插入一個(gè)子串以及刪除一個(gè)子串等。
    2011-05-05
  • MYSQL METADATA LOCK(MDL LOCK)MDL鎖問(wèn)題分析

    MYSQL METADATA LOCK(MDL LOCK)MDL鎖問(wèn)題分析

    這篇文章主要介紹了MYSQL METADATA LOCK(MDL LOCK)MDL鎖問(wèn)題分析,并通過(guò)實(shí)例給大家例句的問(wèn)題處理辦法,需要的朋友參考學(xué)習(xí)下。
    2017-12-12
  • Mysql5.5安裝配置方法及中文亂碼的快速解決方法

    Mysql5.5安裝配置方法及中文亂碼的快速解決方法

    這篇文章主要介紹了Mysql5.5安裝配置方法以及mysql5.5中文亂碼的快速解決方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • MySQL中文漢字轉(zhuǎn)拼音的自定義函數(shù)和使用實(shí)例(首字的首字母)

    MySQL中文漢字轉(zhuǎn)拼音的自定義函數(shù)和使用實(shí)例(首字的首字母)

    這篇文章主要介紹了MySQL中文漢字轉(zhuǎn)拼音的自定義函數(shù)和使用實(shí)例,需要的朋友可以參考下
    2014-06-06
  • MySQL中的長(zhǎng)事務(wù)示例詳解

    MySQL中的長(zhǎng)事務(wù)示例詳解

    這篇文章主要給大家介紹了關(guān)于MySQL中長(zhǎng)事務(wù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • MySQL初始密碼的查看方式

    MySQL初始密碼的查看方式

    這篇文章主要介紹了MySQL初始密碼的查看方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08

最新評(píng)論

越西县| 土默特右旗| 巫山县| 泰兴市| 怀柔区| 定兴县| 永春县| 泰和县| 阜阳市| 怀安县| 台湾省| 吉林省| 赤峰市| 介休市| 基隆市| 宣汉县| 民权县| 勐海县| 新丰县| 华亭县| 中宁县| 泌阳县| 威海市| 海安县| 华蓥市| 广平县| 崇左市| 洛阳市| 青州市| 唐山市| 沾益县| 大港区| 吉安县| 石阡县| 武义县| 宜良县| 禹州市| 宾川县| 翁牛特旗| 金塔县| 全南县|