查詢請求的處理方法和裝置的制造方法
【技術領域】
[0001]本申請涉及數據處理技術領域,尤其涉及一種查詢請求的處理方法和裝置。
【背景技術】
[0002]線上應用在使用數據庫時,針對OLTP (On-Line Transact1n Processing聯機事務處理系統)類型的應用,其查詢的結果集一般是較小的,即需要與存儲引擎進行很少次數的交互即可完成一次查詢請求,這類查詢可以稱為小查詢;但是,線上應用還存在結果集很大的查詢或未正確使用索引的查詢,后兩種查詢都需要與存儲引擎進行較多次數的交互才能完成一次查詢,這類查詢可以稱為大查詢。相關技術中,大查詢與小查詢的優先級相同,導致數據庫存儲引擎并發控制策略下查詢的響應速度慢,查詢效率低。
【發明內容】
[0003]本申請旨在至少在一定程度上解決相關技術中的技術問題之一。
[0004]為此,本申請的一個目的在于提出一種查詢請求的處理方法,該方法可以提高存儲引擎的查詢效率。
[0005]本申請的另一個目的在于提出一種查詢請求的處理裝置。
[0006]為達到上述目的,本申請實施例提出的查詢請求的處理方法,包括:接收申請進入存儲引擎的線程,所述線程是處理當前語句的線程;確定所述線程申請進入存儲引擎后,為所述線程分配進入許可的當前次數;為所述線程分配第一進入許可數值,其中,所述第一進入許可數值與所述當前次數成反比關系。
[0007]本申請實施例提出的查詢請求的處理方法,通過在有線程申請進入存儲引擎時確定所述線程申請進入存儲引擎的當前次數,為所述線程分配第一進入許可數值,由于第一進入許可數值與當前次數成反比關系,因此當線程申請進入存儲引擎的次數越多,分給其的進入許可數值就越小,也就是說大查詢的優先級將降低,實現自動調整查詢的優先級,提升基于并發控制策略的查詢響應時間,提高存儲引擎的查詢效率。
[0008]為達到上述目的,本申請實施例提出的查詢請求的處理裝置,包括:接收模塊,用于接收申請進入存儲引擎的線程,所述線程是處理當前語句的線程;確定模塊,用于確定所述線程申請進入存儲引擎后,為所述線程分配進入許可的當前次數;分配模塊,用于為所述線程分配第一進入許可數值,其中,所述第一進入許可數值與所述當前次數成反比關系。
[0009]本申請實施例提出的查詢請求的處理裝置,通過在有線程申請進入存儲引擎時確定所述線程申請進入存儲引擎的當前次數,為所述線程分配第一進入許可數值,由于第一進入許可數值與當前次數成反比關系,因此當線程申請進入存儲引擎的次數越多,分給其的進入許可數值就越小,也就是說大查詢的優先級將降低,實現自動調整查詢的優先級,提升基于并發控制策略的查詢響應時間,提高存儲引擎的查詢效率。
[0010]本申請附加的方面和優點將在下面的描述中部分給出,部分將從下面的描述中變得明顯,或通過本申請的實踐了解到。
【附圖說明】
[0011]本申請上述的和/或附加的方面和優點從下面結合附圖對實施例的描述中將變得明顯和容易理解,其中:
[0012]圖1是本申請實施例提出的查詢請求的處理方法的流程示意圖;
[0013]圖2是本申請實施例提出的查詢請求的處理方法的流程示意圖;
[0014]圖3是采用本申請實施例的方法來處理查詢請求的測試結果示意圖;
[0015]圖4是本申請另一實施例的查詢請求的處理裝置的結構示意圖;
[0016]圖5是本申請另一實施例的查詢請求的處理裝置的結構示意圖。
【具體實施方式】
[0017]下面詳細描述本申請的實施例,所述實施例的示例在附圖中示出,其中自始至終相同或類似的標號表示相同或類似的元件或具有相同或類似功能的元件。下面通過參考附圖描述的實施例是示例性的,僅用于解釋本申請,而不能理解為對本申請的限制。相反,本申請的實施例包括落入所附加權利要求書的精神和內涵范圍內的所有變化、修改和等同物。
[0018]下面參考附圖描述根據本申請實施例的查詢請求的處理方法和裝置。
[0019]圖1是本申請一實施例提出的查詢請求的處理方法的流程示意圖,該方法包括:
[0020]SlOl:接收申請進入存儲引擎的線程,所述線程是處理當前語句的線程。
[0021]具體地,當線程需要進行查詢時,線程可以申請進入存儲引擎,以完成查詢操作,而存儲引擎可以根據相應的參數控制存儲引擎內線程的數量。
[0022]存儲引擎可以設置兩個控制變量:innodb_thread_concurrency和innodb_concurrency_tickets0 innodb_thread_concurrency控制存儲引擎內部最多同時運行的工作線程數目;innodb_concurrency_tickets表示線程進入存儲引擎后免于并發控制檢查的許可數。
[0023]在線程申請進入存儲引擎時,存儲引擎將檢查已經進入存儲引擎的線程數。如果線程數已經超過innodb_thread_concurrency,則此時申請進入的線程將會在存儲引擎外排隊等待。如果線程數沒有超過innodb_thread_concurrency,則可以允許線程進入存儲引擎,在線程進入存儲引擎后,innodb_concurrency_tickets表示此線程再次進入存儲引擎是否需要排隊等待:在線程被允許進入存儲引擎后,會先被分配進入許可(tickets)數值,分配的tickets的首次數值是innodb_concurrency_tickets,后續流程中如果線程具有的tickets數值大于0,則和存儲引擎的交互將不會受到并發控制限制而直接進入存儲引擎,此時仍舊會占用innodb_thread_concurrency的槽位數。
[0024]S102:確定所述線程申請進入存儲引擎后,為所述線程分配進入許可的當前次數。
[0025]如上所述,在線程進入存儲引擎后,如果該線程沒有tickets,則為該線程分配tickets。
[0026]具體地,初始化時,可設置當前次數為0,當所述線程第一次被分配進入許可之前,當前次數的初始值即為0,之后,當每被分配一次進入許可,該當前次數的數值加1,直到得到當前運算時的當前次數。
[0027]S103:為所述線程分配第一進入許可數值,其中,第一進入許可數值與當前次數成反比關系。
[0028]相關技術中,不論是大查詢還是小查詢,當線程需要獲取進入許可(tickets)數值時,會為線程分配innodb_concurrency_tickets數目的進入許可數值。但是,由于大查詢相對于小查詢對響應時間的容忍度更高,因此可以適當提高小查詢的優先級。
[0029]為此,本實施例中分配的第一許可數值可以與當前次數成反比關系,實現隨著線程獲取進入許可的次數的增加分配的進入許可數值變小,從而使得小查詢優先進入存儲引擎。
[0030]具體地,存儲引擎可以根據獲取到的當前次數和已知的參數,為所述線程分配第一進入許可數值。
[0031]在本申請的一個具體實施例中,分配的第一進入許可數值可通過以下方式獲得:
[0032]計算A/2m ;若A/2m小于B,則N = B,若A/2M大于或等于B,則N = A/2M。
[0033]其中,N是分配的第一進入許可數值;A是已有參數指定的數值,即在需要分配第一進入許可數值時,初始化的分配值,由預設參數指定;B是預設的下限值,即分配的第一進入許可數值的最小值,常規地,B應小于A ;M是當前次數,M的初始值是O。
[0034]本實施例通過在有線程申請進入存儲引擎時確定所述線程申請進入存儲引擎的當前次數,為所述線程分配第一進入許可數值,由于第一進入許可數值與當前次數成反比關系,因此當線程申請進入存儲引擎的次數越多,分給其的進入許可數值就越小,也就是說大查詢的優先級將降低,實現自動調整查詢的優先級,提升基于并發控制策略的查詢響應時間,提高