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

從Join的實(shí)現(xiàn)窺探MySQL迭代器

數(shù)據(jù)庫 MySQL
sql_select.cc?內(nèi)函數(shù)bool Sql_cmd_dml::execute(THD *thd)?函數(shù)內(nèi)主要操作為函數(shù)execute_inner?,在函數(shù)execute_inner內(nèi)首先會(huì)對(duì)當(dāng)前的執(zhí)行優(yōu)化操作。

以如下left join查詢語句為范例:

select * from t1 left join t2 on t1.c=t2.a ;

以下初始化數(shù)據(jù):

1  DROP TABLE IF EXISTS `t1`;
2 CREATE TABLE `t1` (
3 `a` int DEFAULT NULL,
4 `b` varchar(20) DEFAULT NULL
5 )
6 INSERT INTO `t1` VALUES (1, 'a');
7 INSERT INTO `t1` VALUES (1, 'b');
8 INSERT INTO `t1` VALUES (4, 'a');
9 INSERT INTO `t1` VALUES (5, 'a');
10
11 DROP TABLE IF EXISTS `t2`;
12 CREATE TABLE `t2` (
13 `c` int DEFAULT NULL,
14 `d` varchar(20) DEFAULT NULL
15 )
16 INSERT INTO `t2` VALUES (9, 'i');
17 INSERT INTO `t2` VALUES (1, 'i');
18 INSERT INTO `t2` VALUES (2, 'i');
19 INSERT INTO `t2` VALUES (3, 'i');

1.處理join的yacc入口

在sys_yacc.yy?文件內(nèi)解析t1 left join t2 on t1.c=t2.a;對(duì)應(yīng)處理位置。

1  table_reference outer_join_type table_reference ON_SYM expr
2 {
3 $$= NEW_PTN PT_joined_table_on($1, @2, $2, $3, $5);
4 }

其中outer_join_type對(duì)應(yīng)。

1  outer_join_type:
2 LEFT opt_outer JOIN_SYM { $$= JTT_LEFT; }
3 | RIGHT opt_outer JOIN_SYM { $$= JTT_RIGHT; }

入?yún)⑻幚碓诤瘮?shù)T_joined_table_on內(nèi)。

2.移步到函數(shù)PT_joined_table_on

從PT_joined_table_on?聲明可知其繼承PT_joined_table?函數(shù),入?yún)⒆笥冶碣x值為PT_joined_table內(nèi)定義的tr1和tr2。

函數(shù)PT_joined_table_on?將輸入join的左右表加入context內(nèi),并調(diào)用add_join_on將on內(nèi)的條件加入右表,記錄后續(xù)數(shù)據(jù)過濾條件。

3.執(zhí)行階段函數(shù)do_command(thd)

具體對(duì)應(yīng)執(zhí)行函數(shù)int mysql_execute_command(THD *thd, bool first_level)?,語句解析以及相應(yīng)參數(shù)保存完成后,進(jìn)入函數(shù)int mysql_execute_command(THD *thd, bool first_level)?,此函數(shù)內(nèi)根據(jù)前面解析到的命令類型switch (lex->sql_command)?調(diào)用對(duì)應(yīng)的處理函數(shù),如當(dāng)前語句為例查詢命令解析為lex->sql_command = SQLCOM_SELECT?則進(jìn)入函數(shù)lex->m_sql_cmd->execute(thd)?;其對(duì)應(yīng)為sql_select.cc?內(nèi)函數(shù)bool Sql_cmd_dml::execute(THD *thd)。

4.優(yōu)化器操作,生成access_paths

sql_select.cc?內(nèi)函數(shù)bool Sql_cmd_dml::execute(THD *thd)?函數(shù)內(nèi)主要操作為函數(shù)execute_inner?,在函數(shù)execute_inner內(nèi)首先會(huì)對(duì)當(dāng)前的執(zhí)行優(yōu)化操作。

調(diào)用查詢表達(dá)式Query_expression?的優(yōu)化器unit->optimize?,此函數(shù)中會(huì)對(duì)該Query_expression?的內(nèi)的每個(gè)查詢塊query_block分別先進(jìn)行優(yōu)化操作。

查詢塊內(nèi)函數(shù)bool JOIN::optimize()?內(nèi)會(huì)將每個(gè)查詢塊優(yōu)化生成查詢執(zhí)行計(jì)劃 ,具體執(zhí)行函數(shù)為函數(shù)JOIN::create_access_paths()內(nèi)create_root_access_path_for_join()?函數(shù),以當(dāng)前查詢?yōu)槔诤瘮?shù)create_root_access_path_for_join?內(nèi)根據(jù)參數(shù)條件主要調(diào)用ConnectJoins函數(shù)。

在函數(shù)ConnectJoins?內(nèi)調(diào)用FindSubstructure判斷是join類型內(nèi)連接、外連接、半鏈接等類型。

根據(jù)FindSubstructure?返回join類型調(diào)用相應(yīng)的函數(shù)生成path,當(dāng)前查詢?yōu)槔龍?zhí)行調(diào)用CreateHashJoinAccessPath生成path。

至此查詢塊query_block?的優(yōu)化操作和path生成完成,查詢塊優(yōu)化操作完成后再執(zhí)行整體表達(dá)式Query_expression的優(yōu)化和path的生成,因?yàn)槟壳胺独齼H為一個(gè)查詢塊,所以當(dāng)前無需再做整體表達(dá)式的優(yōu)化和path生成。

5.創(chuàng)建迭代器iterator

根據(jù)上一步生成的path調(diào)用CreateIteratorFromAccessPath函數(shù)生成迭代器,用于循環(huán)操作各表數(shù)據(jù)。

在此函數(shù)內(nèi)會(huì)根據(jù)path的類型調(diào)用生成不同類型的迭代器,以目前范例為例,會(huì)調(diào)用迭代器類型為HashJoinIterator。

6.上述4、5步執(zhí)行完成后,執(zhí)行迭代器iterator

在函數(shù)execute_inner?內(nèi)執(zhí)行完成上述4、5步驟操作后主要繼續(xù)執(zhí)行unit->execute(thd)?函數(shù),其對(duì)應(yīng)執(zhí)行查詢表達(dá)式函數(shù)bool Query_expression::ExecuteIteratorQuery(THD *thd)。

函數(shù)Query_expression::ExecuteIteratorQuery?內(nèi)主要執(zhí)行m_root_iterator->Init()?,迭代器iterator初始化,當(dāng)前范例為使用HashJoinIterator?類型迭代器,因此對(duì)應(yīng)執(zhí)行迭代器函數(shù)HashJoinIterator::Init()。

執(zhí)行m_build_input->Init()?來初始右表table句柄,用于下面函數(shù)BuildHashTable()?內(nèi)讀取右表數(shù)據(jù)以便初始化返回?cái)?shù)據(jù)存儲(chǔ)表hashtable?,值得注意的是BuildHashTable?函數(shù)內(nèi)會(huì)根據(jù)處理流程調(diào)用SetReadingProbeRowState設(shè)置執(zhí)行狀態(tài)用于引導(dǎo)后續(xù)迭代器iterator執(zhí)行流程。

函數(shù)內(nèi)最后調(diào)用InitProbeIterator?執(zhí)行m_probe_input->Init()初始左表table句柄用于下面函數(shù)讀取左表數(shù)據(jù)。

上面操作完成后執(zhí)行m_root_iterator->Read()?函數(shù),以當(dāng)前查詢?yōu)榉独鋵?duì)應(yīng)int HashJoinIterator::Read()?函數(shù),執(zhí)行過程中根據(jù)前面SetReadingProbeRowState?設(shè)置的流程狀態(tài)再選擇對(duì)應(yīng)的操作函數(shù),以當(dāng)前范例則會(huì)循環(huán)讀取左表數(shù)據(jù),而在操作函數(shù)內(nèi)也會(huì)調(diào)用SetReadingProbeRowState?來設(shè)置迭代器iterator下一步操作,直至迭代器處理完成,其中在函數(shù)Query_expression::ExecuteIteratorQuery,每次讀取一條成功后就會(huì)調(diào)用send_data操作將結(jié)果發(fā)送至客戶端,直至所有查詢結(jié)果發(fā)送完成。

7.至此客戶端收到相應(yīng)顯示查詢結(jié)果。

責(zé)任編輯:武曉燕 來源: GreatSQL社區(qū)
相關(guān)推薦

2022-02-07 21:49:06

瀏覽器渲染chromium

2020-11-16 08:10:04

ES6迭代器JavaScript

2024-09-18 13:49:42

2010-12-28 10:15:51

BigtableNoSQL

2010-05-21 17:30:28

2021-08-11 22:18:43

Socket函數(shù)監(jiān)聽

2024-12-10 00:00:10

MySQLJOIN算法

2016-03-28 10:39:05

Python迭代迭代器

2021-11-28 08:03:41

Python迭代器對(duì)象

2009-04-02 10:23:13

實(shí)現(xiàn)JoinMySQL

2024-10-28 08:59:26

2013-08-19 16:44:15

.Net

2009-09-16 17:07:00

linq實(shí)現(xiàn)Left

2013-01-08 09:37:26

大數(shù)據(jù)數(shù)據(jù)采集

2021-08-11 21:46:47

MySQL索引join

2018-04-03 15:20:07

數(shù)據(jù)庫MySQLjoin連接

2020-11-24 08:00:22

JavaScript對(duì)象迭代器

2009-12-15 14:58:19

Ruby迭代器

2011-07-13 13:56:06

STL迭代器

2017-06-26 16:26:15

Python迭代對(duì)象迭代器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品久久久久久久午夜片 | 亚洲一一在线 | 欧美视频福利 | 香蕉一区| 激情一区二区三区 | 日美女逼逼| 无码国模国产在线观看 | 91在线看片 | 国产一区三区在线 | 国产精品色 | 日韩视频中文字幕 | 成人福利在线观看 | 久草www| 91视频在线| 在线视频一区二区 | 一区视频 | 亚洲福利视频一区二区 | 中文字幕国产 | 午夜电影合集 | 日本天堂一区二区 | 成人欧美一区二区三区在线播放 | 一级片在线免费看 | 日韩欧美电影在线 | 国产精品欧美一区喷水 | 99热这里都是精品 | 国产一区二区三区免费观看视频 | 亚洲欧洲日本国产 | 男女国产视频 | 中文字幕精品一区二区三区在线 | 久久精品国产一区二区三区不卡 | 亚洲人成网站777色婷婷 | 久久精品国产99国产精品亚洲 | 午夜a区 | 日韩欧美视频 | 国产精品毛片一区二区在线看 | 自拍偷拍中文字幕 | 久久久欧洲 | 成人免费视屏 | 国产在线观看一区二区 | 日本精品视频一区二区 | 久久久精品一区二区三区 |