MySQL核心技術之「結果傳送」

2021-09-14 08:50:49 字數 2075 閱讀 2590

本節我們主要討論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。

MySQL核心技術之「WHERE條件」

先看一下呼叫鏈 join optimize make join select join tab set condition 這裡就把condition賦值給了join tab。那麼condition是如何產生的呢?是在parse乙個query的時候,具體的是yacc產生的 不用特意關心。舉例來說的,...

MySQL核心技術之「索引查詢」

mysql的索引查詢內部使用的是quick range結構。先讓我們看看呼叫流程 join optimize make join plan estimate rowcount get quick record count test quick select join init read record...

Docker 核心技術之映象

映象是乙個docker的可執行檔案,其中包括執行應用程式所需的所有 內容 依賴庫 環境變數和配置檔案等。通過映象可以建立乙個或多個容器。作用 命令格式 命令引數 options 只搜尋官方的 centos docker search f is official true centos作用 命令格式 ...