日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

《MySQL 8.0.22执行器源码分析(1)——execute iterator一些记录》

發(fā)布時間:2023/12/1 数据库 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《MySQL 8.0.22执行器源码分析(1)——execute iterator一些记录》 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

    • 一條語句的函數(shù)調(diào)用棧順序
    • 8.0使用迭代器模式改進(jìn)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
    • 回顧迭代器模式

一條語句的函數(shù)調(diào)用棧順序

記錄了函數(shù)語句從服務(wù)器main函數(shù)到執(zhí)行器之前的一些具體調(diào)用,5.幾版本到8.0.22版本,這里的調(diào)用順序并沒有多大變化

注意這里是接著上面的2、
處理完之后,開始返回,返回到之前的case

按照網(wǎng)上代碼版本接下來的調(diào)用順序應(yīng)該是這樣的:這里的JOIN::exec() 和do_select我沒有在8.0代碼中找到,就直接跳過這兩個函數(shù)吧。

8.0使用迭代器模式改進(jìn)executor

在文章https://cloud.tencent.com/developer/article/1461353中說道:
MySQL8.0對執(zhí)行器進(jìn)行了改進(jìn),創(chuàng)建一個新的用于迭代訪問記錄的API,它足夠通用,可以替換MySQL中所有原有的記錄迭代器,并逐步替代掉原有的執(zhí)行器。
這是之前的執(zhí)行器接口:

這是現(xiàn)在的:

該文章列出了一些迭代器類型:

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

下面是我對mysql語句
use table;debug時發(fā)現(xiàn)的迭代器調(diào)用順序:
不知道解讀是否正確。

之后就是將結(jié)果排序:

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()

一個迭代器,它接收一行流,并且僅通過那些滿足某些條件(即條件的結(jié)果為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()

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

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()只會將調(diào)用轉(zhuǎn)給子查詢迭代器,并執(zhí)行從一組字段到另一組的所需復(fù)制。它用于優(yōu)化程序設(shè)置的實(shí)現(xiàn)的時間。

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

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

保證所有產(chǎn)生的序列都是非空的。返回的是成功記錄的記錄數(shù)

https://dev.mysql.com/doc/dev/mysql-server/latest/filesort_8cc.html#acfc65b7a8828ea94df20c3944d1947fd

回顧迭代器模式

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

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

(針對不同對象)

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

為遍歷不同的聚集結(jié)構(gòu)提供統(tǒng)一接口。

關(guān)于MySQL8.0版本的迭代器的作用在后面的筆記繼續(xù)介紹。

總結(jié)

以上是生活随笔為你收集整理的《MySQL 8.0.22执行器源码分析(1)——execute iterator一些记录》的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。