摘要:本節(jié)我們主要討論的結(jié)果處理與發(fā)送。執(zhí)行的累加結(jié)果存在中的變量里,結(jié)束后被返回給客戶端。因?yàn)闆]有,所以返回的結(jié)果只有一條記錄。每個執(zhí)行的結(jié)果放在這對應(yīng)的中,執(zhí)行完畢后退出,而由主統(tǒng)計結(jié)果并發(fā)送最后的給。
本節(jié)我們主要討論COUNT的結(jié)果處理與發(fā)送。典型的SQL語句為:SELECT COUNT(*) FROM foo;
查詢結(jié)果處理流程結(jié)果累加調(diào)用鏈
JOIN::exec()--> do_select()--> sub_select()--> evaluate_join_record()--> end_send_group()--> init_sum_functions--> reset_and_add()--> aggregator_add()--> Item_sum_count::add()
返回結(jié)果調(diào)用鏈
JOIN::exec()--> do_select()--> sub_select()--> evaluate_join_record()--> end_send_group()--> send_data--> send_result_set_row()--> Item::send()--> Item_sum_count::val_int()
注意:上面的end_send_group實(shí)際上是evaluate_join_record()中的這行代碼:rc= (*qep_tab->next_select)(join, qep_tab+1, 0);
整個邏輯是sub_select()中有個大循環(huán),每次讀出一條數(shù)據(jù),然后進(jìn)行evaluate_join_record()。在evaluate_join_record()中進(jìn)行where判斷等,然后調(diào)用end_send或者end_send_group進(jìn)行最后處理。因?yàn)檫@里是COUNT因此,使用end_send_group()。end_send_group調(diào)用reset_and_add進(jìn)行累加。
發(fā)送完畢調(diào)用鏈(這個執(zhí)行完客戶端就有數(shù)據(jù)顯示了)
dispatch_command()--> thd->send_statement_status()多線程并發(fā)執(zhí)行改造
現(xiàn)在我們來看看如何多結(jié)果處理流程進(jìn)行改造。從上面分析可以看出,每次讀出一條數(shù)據(jù)就要進(jìn)入evaluate,調(diào)用end_send_group產(chǎn)看是否應(yīng)該累加還是累加已經(jīng)完畢。因此我們要在end_send_group加入新的邏輯,累加過程不變,但是累加完畢后,并不發(fā)送而是把結(jié)果放入select->m_parallel_results里,同時把done位置為true
而主線程要查看worker是否都完成了,即把結(jié)果放入select->m_parallel_results,如果是則進(jìn)行所有的結(jié)果累加,還是加到item_sum中的count上。然后走正常的流程。
附錄
MySQL的COUNT操作對應(yīng)了Item_sum_count類,這個類是基于Item_sum類的。那么對應(yīng)一個JOIN結(jié)構(gòu)而言,里面包含了一個(其實(shí)是2個)Item_sum:分別是。Item_sum_count就被賦給了Item_sum這個成員變量。
?
執(zhí)行的累加結(jié)果存在Item_sum_count中的count變量里,結(jié)束后被返回給客戶端。因?yàn)闆]有GROUP BY,所以返回的結(jié)果只有一條記錄。
?
改造的方法:因?yàn)橐粋€JOIN對應(yīng)了query的上下文,優(yōu)化后的結(jié)果,如果同時被不同的thread執(zhí)行,那么應(yīng)該有多個count結(jié)果,而不是一個,這樣我們就可以增加一個標(biāo)志位為parallel,同時增加Item_sum_count中的member:count數(shù)組,其數(shù)量對應(yīng)了多少個thread。每個thread執(zhí)行的結(jié)果放在這對應(yīng)的count中,執(zhí)行完畢后worker thread退出,而由主thread統(tǒng)計結(jié)果并發(fā)送最后的count給client。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/17646.html
閱讀 3387·2021-11-22 09:34
閱讀 660·2021-11-19 11:29
閱讀 1363·2019-08-30 15:43
閱讀 2243·2019-08-30 14:24
閱讀 1876·2019-08-29 17:31
閱讀 1235·2019-08-29 17:17
閱讀 2624·2019-08-29 15:38
閱讀 2741·2019-08-26 12:10