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