《MySQL 8.0.22執行器源碼分析(1)——execute iterator一些記錄》

目錄

    • 一條語句的函數調用棧順序
    • 8.0使用迭代器模式改進executor
      • int *handler*::ha_rnd_next(*uchar* **buf*)
      • int *TableScanIterator*::Read()
      • int FilterIterator :: Read()
      • int HashJoinIterator::Read()
      • int NestedLoopIterator :: Read()
      • int StreamingIterator::Read ()
      • *ha_rows* read_all_rows
    • 回顧迭代器模式

一條語句的函數調用棧順序

記錄了函數語句從服務器main函數到執行器之前的一些具體調用,5.幾版本到8.0.22版本,這里的調用順序并沒有多大變化
在這里插入圖片描述
注意這里是接著上面的2、在這里插入圖片描述
處理完之后,開始返回,返回到之前的case
在這里插入圖片描述
按照網上代碼版本接下來的調用順序應該是這樣的:這里的JOIN::exec()do_select我沒有在8.0代碼中找到,就直接跳過這兩個函數吧。

在這里插入圖片描述

8.0使用迭代器模式改進executor

在文章https://cloud.tencent.com/developer/article/1461353中說道:
MySQL8.0對執行器進行了改進,創建一個新的用于迭代訪問記錄的API,它足夠通用,可以替換MySQL中所有原有的記錄迭代器,并逐步替代掉原有的執行器。
這是之前的執行器接口:
在這里插入圖片描述
這是現在的:
在這里插入圖片描述
該文章列出了一些迭代器類型:

TableScanIterator:順序掃描,調用存儲引擎接口ha_rnd_next獲取一行記錄。
IndexScanIterator:全量索引掃描,根據掃描順序,分別調用ha_index_next或者ha_index_prev來獲取一行記錄。
IndexRangeScanIterator:范圍索引掃描,包裝了下QUICK_SELECT_I,調用QUICK_SELECT_I::get_next來獲取一行記錄。
SortingIterator:對另一個迭代器輸出進行排序。
SortBufferIterator:從緩沖區讀取已經排好序的結果集,(主要給SortingIterator調用)
SortBufferIndirectIterator:從緩沖區讀取行ID然后從表中讀取對應的行(由SortingIterator和某些形式的unique操作使用)
SortFileIterator:從文件中讀取已經排好序的結果集(主要給SortingIterator調用)
SortFileIndirectIterator:從文件讀取行ID然后從表中讀取對應的行(由SortingIterator和某些形式的unique操作使用)
RefIterator:從連接右表中讀取指定key的行。
RefOrNullIterator:從連接右表中讀取指定key或者為NULL的行。
EQRefIterator:使用唯一key來從連接的右表中讀取行。
ConstIterator:從一個只可能匹配出一行的表(Const Table)中讀取一行數據。
FullTextSearchIterator:使用全文檢索索引讀取一行數據。
DynamicRangeIterator:為每一行調用范圍優化器,然后根據需要包裝QUICK_SELECT_I或表掃描。
PushedJoinRefIterator:讀取已下推到NDB的連接的輸出。
FilterIterator: 讀取一系列行,輸出符合條件的行,用來實現WHERE/HAVING。
LimitOffsetIterator: 從offset開始讀取行,直到滿足limit限制,用來實現LIMIT/OFFSET。
AggregateIterator: 實現聚集函數并且如果需要的話進行分組操作。
NestedLoopiterator: 使用嵌套循環算法連接兩個迭代器(內連接,外連接或反連接)。
MaterializeIterator: 從另一個迭代器讀取結果,并放入臨時表,然后讀取臨時表記錄。
FakeSingleRowIterator: 返回單行,然后結束。 僅在某些使用const表情況下才使用(例如只有const表,仍然需要一個迭代器來讀取該單行)

下面是我對mysql語句
use table;debug時發現的迭代器調用順序:
不知道解讀是否正確。
在這里插入圖片描述
之后就是將結果排序:
在這里插入圖片描述

int handler::ha_rnd_next(uchar *buf)

https://dev.mysql.com/doc/dev/mysql-server/latest/classhandler.html#ad3743f3a48e7be751dbb2691be4c992a
在這里插入圖片描述

int TableScanIterator::Read()

https://dev.mysql.com/doc/dev/mysql-server/latest/classFilterIterator.html
在這里插入圖片描述

int FilterIterator :: Read()

一個迭代器,它接收一行流,并且僅通過那些滿足某些條件(即條件的結果為true)的行。

https://dev.mysql.com/doc/dev/mysql-server/latest/classFilterIterator.html#a166014f053203bb025d12e95180d8ffa
在這里插入圖片描述

int HashJoinIterator::Read()

https://dev.mysql.com/doc/dev/mysql-server/latest/classHashJoinIterator.html#a64f8107d4a8b3bb1ab7804e9e1c2689c

在這里插入圖片描述

int NestedLoopIterator :: Read()

一個簡單的嵌套循環連接,接受兩個迭代器(左/外和右/內)并將他們連接到一起。這可能會多次掃描內部迭代器。迭代器用作狀態機,其中狀態記錄我們是否需要讀取新的外部行,以及是否從內部迭代器中看到任何行(如果沒有,則外部聯接需要合成新的行)

https://dev.mysql.com/doc/dev/mysql-server/latest/classNestedLoopIterator.html
在這里插入圖片描述

int StreamingIterator::Read ()

https://dev.mysql.com/doc/dev/mysql-server/latest/classStreamingIterator.html#details

StreamingIterator的每個Read()只會將調用轉給子查詢迭代器,并執行從一組字段到另一組的所需復制。它用于優化程序設置的實現的時間。

It is used for when the optimizer would normally set up a materialization, but you don't actually need one, ie. you don't want to read the rows multiple times after writing them, and you don't want to access them by index (only a single table scan). It also takes care of setting the NULL row flag on the temporary table.

這段英文沒讀懂。。。
在這里插入圖片描述

ha_rows read_all_rows

讀取所有行,并將它們寫入一個臨時文件(如果我們在排序緩沖區中空間不足)。

保證所有產生的序列都是非空的。返回的是成功記錄的記錄數

https://dev.mysql.com/doc/dev/mysql-server/latest/filesort_8cc.html#acfc65b7a8828ea94df20c3944d1947fd
在這里插入圖片描述

回顧迭代器模式

迭代器模式:提供一種方法順序訪問一個聚合對象中各個元素,而不暴露該對象的內部表示。

當我們需要訪問一個聚集對象,而且不管這些對象是什么都需要遍歷的時候,就應該考慮用迭代器模式。

(針對不同對象)

當我們對聚集有多種方式遍歷時,可以考慮用迭代器模式。(針對不同遍歷方式,如從前往后、從后往前)

為遍歷不同的聚集結構提供統一接口。

關于MySQL8.0版本的迭代器的作用在后面的筆記繼續介紹。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377130.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377130.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377130.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于autoupgader的狗屎問題

由于win7和xp的權限問題,導致這個自動升級玩意不正常。這個狗屎問題很簡單,把exe文件的兼容性設定該一下。真是氣死灑家了。轉載于:https://www.cnblogs.com/usegear/p/3679097.html

strcspn函數

函數原型&#xff1a;extern int strcspn(char *str1,char *str2) 參數說明&#xff1a;str1為參照字符串&#xff0c;即str2中每個字符分別與str1中的每個字符比較。 所在庫名&#xff1a;#include <string.h> 函數功能&#xff1a;以str1為參照&#xff0c…

c語言 sqlite_SQLite與C語言

c語言 sqliteSQLite數據庫簡介 (Introduction to SQLite database) SQLite is a relational database; it is used for embedded devices. Now a day it is using worldwide for different embedded devices. SQLite是一個關系數據庫。 它用于嵌入式設備。 如今&#xff0c;它已…

《MySQL 8.0.22執行器源碼分析(2)解讀函數 ExecuteIteratorQuery》

函數代碼 bool SELECT_LEX_UNIT::ExecuteIteratorQuery(THD *thd) {THD_STAGE_INFO(thd, stage_executing);DEBUG_SYNC(thd, "before_join_exec");Opt_trace_context *const trace &thd->opt_trace;Opt_trace_object trace_wrapper(trace);Opt_trace_object…

C語言,如何產生隨機數

1. 基本函數 在C語言中取隨機數所需要的函數是: int rand(void);void srand (unsigned int n); rand()函數和srand()函數被聲明在頭文件stdlib.h中,所以要使用這兩個函數必須包含該頭文件: #include <stdlib.h> 2. 使用方法 rand()函數返回0到RAND_MAX之間的偽隨機數(pse…

MongoDB源碼概述——內存管理和存儲引擎

數據存儲&#xff1a; 之前在介紹Journal的時候有說到為什么MongoDB會先把數據放入內存&#xff0c;而不是直接持久化到數據庫存儲文件&#xff0c;這與MongoDB對數據庫記錄文件的存儲管理操作有關。MongoDB采用操作系統底層提供的內存文件映射&#xff08;MMap&#xff09;的方…

OBTW的完整形式是什么?

OBTW&#xff1a;哦&#xff0c;順便說一下 (OBTW: Oh, By The Way) OBTW is an abbreviation of "Oh, By The Way". OBTW是“哦&#xff0c;順便說一下”的縮寫 。 It is an expression, which is commonly used in messaging or chatting on social media network…

SharePoint 2010 Form Authentication (SQL) based on existing database

博客地址 http://blog.csdn.net/foxdaveSharePoint 2010 表單認證&#xff0c;基于現有數據庫的用戶信息表本文主要描述本人配置過程中涉及到的步驟&#xff0c;僅作為參考&#xff0c;不要僅限于此步驟。另外本文通俗易懂&#xff0c;適合大眾口味兒。I. 開啟并配置基于聲明的…

《MySQL 8.0.22執行器源碼分析(3.1)關于RowIterator》

目錄RowIteratorInit()Read()SetNullRowFlag()UnlockRow()StartPSIBatchMode()EndPSIBatchModeIfStarted()real_iterator()RowIterator 使用選定的訪問方法讀取單個表的上下文&#xff1a;索引讀取&#xff0c;掃描等&#xff0c;緩存的使用等。 它主要是用作接口&#xff0c;但…

hdu 2432法里數列

這題本來完全沒思路的&#xff0c;后來想一想&#xff0c;要不打個表找找規律吧。于是打了個表&#xff0c;真找到規律了。。。 打表的代碼如下&#xff1a; int n; void dfs(int x1, int y1, int x2, int y2) {if (y1 y2 < n) {dfs(x1, y1, x1 x2, y1 y2);printf("…

python學習筆記四——數據類型

1.數字類型&#xff1a; 2.字符串類型&#xff1a; 切片&#xff1a;a[m:n:s] m:起始值 n:結束值&#xff08;不包括n&#xff09; s:步長&#xff0c;負數表示從后向前取值 3.序列&#xff1a;列表&#xff0c;元組和字符串都是序列 序列的兩個主要特點是索引操作符和切片…

小狐貍ChatGPT系統 不同老版本升級至新版數據庫結構同步教程

最新版2.6.7下載&#xff1a;https://download.csdn.net/download/mo3408/88656497 小狐貍GPT付費體驗系統如何升級&#xff0c;該系統更新比較頻繁&#xff0c;也造成了特別有用戶數據情況下升級時麻煩&#xff0c;特別針對會員關心的問題出一篇操作教程&#xff0c;本次教程…

《MySQL 8.0.22執行器源碼分析(3.2)關于HashJoinIterator》

在本文章之前&#xff0c;應該了解的概念&#xff1a; 連接的一些概念、NLJ、BNL、HashJoin算法。 目錄關于join連接probe行保存概念Hashjoin執行流程&#xff08;十分重要&#xff09;HashJoinIterator成員函數講解1、BuildHashTable2、ReadNextHashJoinChunk3、ReadRowFromPr…

json 語法_JSON的基本語法

json 語法JSON which stands for JavaScript Object Notation is a lightweight readable data format that is structurally similar to a JavaScript object much like its name suggests. 代表JavaScript Object Notation的 JSON是一種輕量級的可讀數據格式&#xff0c;其結…

RFC3261(17 事務)

SIP是一個基于事務處理的協議&#xff1a;部件之間的交互是通過一系列相互獨立的消息交換來完成的。特別是&#xff0c;一個SIP 事務由一個單個請求和這個請求的所有應答組成&#xff0c;這些應答包括了零個或者多個臨時應答以及一個或者多個終結應答。在事務中&#xff0c;當請…

HDUOJ---1754 I Hate It (線段樹之單點更新查區間最大值)

I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 33469 Accepted Submission(s): 13168 Problem Description很多學校流行一種比較的習慣。老師們很喜歡詢問&#xff0c;從某某到某某當中&#xff0c;…

WEG的完整形式是什么?

WEG&#xff1a;邪惡邪惡的咧嘴 (WEG: Wicked Evil Grin) WEG is an abbreviation of "Wicked Evil Grin". WEG是“ Wicked Evil Grin”的縮寫 。 It is also known as EWG (Evil Wicked Grin) "Grin" refers to a broad smile. "Wicked" refer…

C# 把數字轉換成鏈表

例如&#xff1a;123456轉換成 1 -> 2 -> 3-> 4-> 5-> 6 View Code static LinkedList<int> CovertIntToLinkedList(int num){Stack<int> stack new Stack<int>();LinkedList<int> result new LinkedList<int>();while (num!0…

《MySQL 8.0.22執行器源碼分析(4.1)Item_sum類以及聚合》

Item_sum類用于SQL聚合函數的特殊表達式基類。 這些表達式是在聚合函數&#xff08;sum、max&#xff09;等幫助下形成的。item_sum類也是window函數的基類。 聚合函數&#xff08;Aggregate Function&#xff09;實現的大部分代碼在item_sum.h和item_sum.cc 聚合函數限制 不…

Java 性能優化實戰記錄(2)---句柄泄漏和監控

前言: Java不存在內存泄漏, 但存在過期引用以及資源泄漏. (個人看法, 請大牛指正) 這邊對文件句柄泄漏的場景進行下模擬, 并對此做下簡單的分析.如下代碼為模擬一個服務進程, 忽略了句柄關閉, 造成不能繼續正常服務的小場景. 1 public class FileHandleLeakExample {2 3 p…