国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

MySQL內核技術之“結果發送”

fxp / 1535人閱讀

摘要:本節我們主要討論的結果處理與發送。執行的累加結果存在中的變量里,結束后被返回給客戶端。因為沒有,所以返回的結果只有一條記錄。每個執行的結果放在這對應的中,執行完畢后退出,而由主統計結果并發送最后的給。

本節我們主要討論COUNT的結果處理與發送。典型的SQL語句為:SELECT COUNT(*) FROM foo;

查詢結果處理流程

結果累加調用鏈

JOIN::exec()--> 
do_select()--> 
sub_select()--> 
evaluate_join_record()--> 
end_send_group()--> 
init_sum_functions--> 
reset_and_add()--> 
aggregator_add()--> 
Item_sum_count::add()

返回結果調用鏈

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實際上是evaluate_join_record()中的這行代碼:rc= (*qep_tab->next_select)(join, qep_tab+1, 0);

整個邏輯是sub_select()中有個大循環,每次讀出一條數據,然后進行evaluate_join_record()。在evaluate_join_record()中進行where判斷等,然后調用end_send或者end_send_group進行最后處理。因為這里是COUNT因此,使用end_send_group()end_send_group調用reset_and_add進行累加。

發送完畢調用鏈(這個執行完客戶端就有數據顯示了)

dispatch_command()--> thd->send_statement_status()
多線程并發執行改造

現在我們來看看如何多結果處理流程進行改造。從上面分析可以看出,每次讀出一條數據就要進入evaluate,調用end_send_group產看是否應該累加還是累加已經完畢。因此我們要在end_send_group加入新的邏輯,累加過程不變,但是累加完畢后,并不發送而是把結果放入select->m_parallel_results里,同時把done位置為true

而主線程要查看worker是否都完成了,即把結果放入select->m_parallel_results,如果是則進行所有的結果累加,還是加到item_sum中的count上。然后走正常的流程。

附錄
MySQL的COUNT操作對應了Item_sum_count類,這個類是基于Item_sum類的。那么對應一個JOIN結構而言,里面包含了一個(其實是2個)Item_sum:分別是。Item_sum_count就被賦給了Item_sum這個成員變量。
?
執行的累加結果存在Item_sum_count中的count變量里,結束后被返回給客戶端。因為沒有GROUP BY,所以返回的結果只有一條記錄。
?
改造的方法:因為一個JOIN對應了query的上下文,優化后的結果,如果同時被不同的thread執行,那么應該有多個count結果,而不是一個,這樣我們就可以增加一個標志位為parallel,同時增加Item_sum_count中的member:count數組,其數量對應了多少個thread。每個thread執行的結果放在這對應的count中,執行完畢后worker thread退出,而由主thread統計結果并發送最后的count給client。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/17646.html

相關文章

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<