一種數(shù)據(jù)查詢方法
【專利摘要】本申請公開了一種數(shù)據(jù)查詢方法,在進(jìn)行數(shù)據(jù)表的分布式存儲時,應(yīng)用服務(wù)器將具有關(guān)聯(lián)關(guān)系的兩個表,按照相同的子表數(shù)進(jìn)行水平拆分,并按照相同的散列公式將兩個表的相同索引號的子表散列到分布式數(shù)據(jù)庫服務(wù)器上,在進(jìn)行數(shù)據(jù)查詢時,數(shù)據(jù)庫服務(wù)器可以根據(jù)子表的關(guān)聯(lián)關(guān)系進(jìn)行簡單的數(shù)據(jù)查詢處理。采用本發(fā)明,可以避免進(jìn)行合并查詢時跨機(jī)查詢的網(wǎng)絡(luò)傳輸開銷,減少復(fù)雜查詢的處理時延,適用于OLTP應(yīng)用場景。
【專利說明】一種數(shù)據(jù)查詢方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及分布式數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)處理技術(shù),特別是涉及一種分布式數(shù)據(jù)庫系統(tǒng)中的數(shù)據(jù)查詢方法。
【背景技術(shù)】
[0002]目前,隨著數(shù)據(jù)規(guī)模及其訪問量對關(guān)系數(shù)據(jù)庫提出了很大挑戰(zhàn):數(shù)十億條的記錄、數(shù)TB的數(shù)據(jù)、數(shù)千TPS、數(shù)萬QPS讓傳統(tǒng)的關(guān)系數(shù)據(jù)庫不堪重負(fù),單純的硬件升級已經(jīng)無法使得問題得到解決。而目前的分布式數(shù)據(jù)庫技術(shù)無法有效的支持復(fù)雜的關(guān)聯(lián)查詢。
[0003]針對該問題,通常是采用對先對數(shù)據(jù)表進(jìn)行水平拆分,然后再把拆分后的各子表分散到多個服務(wù)器上的方式,來實現(xiàn)大規(guī)模數(shù)據(jù)的存儲。具體為:選取數(shù)據(jù)表中的某個或若干字段作為拆分鍵,將記錄散列到不同的數(shù)據(jù)庫服務(wù)器中。當(dāng)客戶端需要訪問某個記錄時,根據(jù)拆分鍵找到記錄所在的服務(wù)器位置;
[0004]上述方法可以實現(xiàn)記錄規(guī)模較大的數(shù)據(jù)表的分布存儲,但是,在進(jìn)行表關(guān)聯(lián)查詢時容易出現(xiàn)跨機(jī)查詢,即需要關(guān)聯(lián)的子表分布在不同的服務(wù)器上,該情況下,一方面各數(shù)據(jù)庫服務(wù)器無法進(jìn)行合并查詢處理,而需要應(yīng)用服務(wù)器從各數(shù)據(jù)庫服務(wù)器中讀取子表后,才能進(jìn)行相應(yīng)的合并查詢處理,這樣就會導(dǎo)致應(yīng)用服務(wù)器的數(shù)據(jù)處理負(fù)荷就會較大,當(dāng)跨機(jī)查詢的數(shù)據(jù)越多時,系統(tǒng)的性能就會越差;另一方面,由于需要將數(shù)據(jù)庫服務(wù)器中的數(shù)據(jù)統(tǒng)一發(fā)送給應(yīng)用服務(wù)器處理,相應(yīng)地,也會造成冗余的網(wǎng)絡(luò)數(shù)據(jù)傳輸。
[0005]因此,在分布式數(shù)據(jù)庫系統(tǒng)下,傳統(tǒng)的數(shù)據(jù)查詢方法存在網(wǎng)絡(luò)傳輸開銷大、處理時延長等問題,無法滿足對時延要求高的在線事物處理(OLTP)應(yīng)用場景下的關(guān)聯(lián)查詢。目前尚未提出一種適用于在OLTP情況下進(jìn)行關(guān)聯(lián)查詢的方法。
【發(fā)明內(nèi)容】
[0006]有鑒于此,本發(fā)明的主要目的在于提供一種數(shù)據(jù)查詢方法,該方法可以有效減少網(wǎng)絡(luò)傳輸開銷,降低處理時延,適用于OLTP應(yīng)用場景。
[0007]為了達(dá)到上述目的,本發(fā)明提出的技術(shù)方案為:
[0008]一種數(shù)據(jù)查詢方法,包括:
[0009]當(dāng)應(yīng)用服務(wù)器對數(shù)據(jù)庫系統(tǒng)中的數(shù)據(jù)進(jìn)行存儲時,對于存在關(guān)聯(lián)關(guān)系的兩個表,根據(jù)所述關(guān)聯(lián)關(guān)系的關(guān)聯(lián)字段,對每個所述表進(jìn)行水平拆分,得到該表的N個子表;
[0010]對于所述兩個表,所述應(yīng)用服務(wù)器根據(jù)子表的索引號,利用相同的散列公式,確定用于存儲各自子表的數(shù)據(jù)庫服務(wù)器;將各所述子表存儲在所確定的數(shù)據(jù)庫服務(wù)器中;對于所述兩個表的每對具有相同索引號的子表,所述應(yīng)用服務(wù)器根據(jù)所述關(guān)聯(lián)關(guān)系,確定該對子表的關(guān)聯(lián)關(guān)系;
[0011]當(dāng)客戶端觸發(fā)根據(jù)所述兩個表的關(guān)聯(lián)關(guān)系進(jìn)行數(shù)據(jù)查詢時,對于滿足查詢條件的子表,將該子表對應(yīng)的關(guān)聯(lián)關(guān)系發(fā)送給子表所在數(shù)據(jù)庫服務(wù)器,同時觸發(fā)所述數(shù)據(jù)庫服務(wù)器根據(jù)該關(guān)聯(lián)關(guān)系,按照所述查詢條件進(jìn)行查詢,并返回結(jié)果給所述應(yīng)用服務(wù)器;[0012]所述應(yīng)用服務(wù)器根據(jù)所述查詢條件,對所述返回結(jié)果進(jìn)行相應(yīng)的查詢處理并反饋結(jié)果給所述客戶端。
[0013]綜上所述,本發(fā)明提出的數(shù)據(jù)查詢方法,在進(jìn)行數(shù)據(jù)表的分布式存儲時,應(yīng)用服務(wù)器將具有關(guān)聯(lián)關(guān)系的兩個表,按照相同的子表數(shù)進(jìn)行水平拆分,并按照相同的散列公式將兩個表的相同索引號的子表散列到分布式數(shù)據(jù)庫服務(wù)器上,如此,可確保具有關(guān)聯(lián)關(guān)系的子表存儲在相同的服務(wù)器上,避免進(jìn)行合并查詢時跨機(jī)查詢的網(wǎng)絡(luò)傳輸開銷,減少復(fù)雜查詢的處理時延,適用于OLTP應(yīng)用場景。
【專利附圖】
【附圖說明】
[0014]圖1為本發(fā)明實施例一的流程示意圖。
【具體實施方式】
[0015]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合附圖及具體實施例對本發(fā)明作進(jìn)一步地詳細(xì)描述。
[0016]本發(fā)明的核心思想是:對于具有關(guān)聯(lián)關(guān)系的兩個表,按照相同的子表數(shù)進(jìn)行水平拆分,并按照相同的散列公式將兩個表的相同索引號的子表散列到分布式數(shù)據(jù)庫服務(wù)器上,使得具有關(guān)聯(lián)關(guān)系的子表存儲在相同的服務(wù)器上,使單個數(shù)據(jù)庫服務(wù)器可以執(zhí)行簡單的查詢合并處理,分擔(dān)應(yīng)用服務(wù)器的部分?jǐn)?shù)據(jù)查詢處理開銷,并可避免進(jìn)行合并查詢時跨機(jī)查詢的網(wǎng)絡(luò)傳輸開銷,減少復(fù)雜查詢的處理時延,適用于OLTP應(yīng)用場景。
[0017]圖1為本發(fā)明實施例一的流程示意圖,如圖1所示,該實施例主要包括:
[0018]步驟101、當(dāng)應(yīng)用服務(wù)器對數(shù)據(jù)庫系統(tǒng)中的數(shù)據(jù)進(jìn)行存儲時,對于存在關(guān)聯(lián)關(guān)系的兩個表,根據(jù)所述關(guān)聯(lián)關(guān)系的關(guān)聯(lián)字段,對每個所述表進(jìn)行水平拆分,得到該表的N個子表。
[0019]本步驟中,與現(xiàn)有方案中的水平拆分所不同的是,需要根據(jù)所述關(guān)聯(lián)關(guān)系的關(guān)聯(lián)字段,來對每個所述表進(jìn)行水平拆分,并且需要確保存在關(guān)聯(lián)關(guān)系的兩個表的拆分子表數(shù)量相同,即均為N個。這樣,由于是以關(guān)聯(lián)字段為拆分鍵,并且子表數(shù)量相同,因此,可以確保具有關(guān)聯(lián)關(guān)系的兩子表的子表索引號相同,以便后續(xù)過程中基于該特性實現(xiàn)具有關(guān)聯(lián)關(guān)系的兩子表存儲在同一服務(wù)器上的目的。
[0020]步驟102、對于所述兩個表,所述應(yīng)用服務(wù)器根據(jù)子表的索引號,利用相同的散列公式,確定用于存儲各自子表的數(shù)據(jù)庫服務(wù)器;將各所述子表存儲在所確定的數(shù)據(jù)庫服務(wù)器中;對于所述兩個表的每對具有相同索引號的子表,所述應(yīng)用服務(wù)器根據(jù)所述關(guān)聯(lián)關(guān)系,確定該對子表的關(guān)聯(lián)關(guān)系。
[0021] 本步驟中,確定子表與存儲子表的服務(wù)器之間對應(yīng)關(guān)系的具體方法同現(xiàn)有系統(tǒng)一樣,與現(xiàn)有方案所不同的是,對于存在關(guān)聯(lián)關(guān)系的兩個表,需要采用相同的散列公式,。這樣,由于散列公式相同,同一子表索引號的散列值也將相同,相同的散列值對應(yīng)的路由路徑也相同,因此,對應(yīng)的數(shù)據(jù)庫服務(wù)器也將相同。而如前所述步驟ιο?中可以確保具有關(guān)聯(lián)關(guān)系的兩子表的子表索引號相同,因此,本步驟可以進(jìn)一步確保具有關(guān)聯(lián)關(guān)系的兩個子表被保存在同一服務(wù)器上,從而可以確保相關(guān)聯(lián)子表的查詢操作在一臺服務(wù)器上即可完成,進(jìn)而可以避免數(shù)據(jù)服務(wù)器之間的數(shù)據(jù)交叉關(guān)聯(lián),避免多余的網(wǎng)絡(luò)數(shù)據(jù)傳輸以及減少聯(lián)合查詢的處理時延。
[0022]另外,本步驟還需要根據(jù)拆分前兩表之間的關(guān)聯(lián)關(guān)系確定相應(yīng)子表之間的關(guān)聯(lián)關(guān)系,以便數(shù)據(jù)庫服務(wù)器可以基于此進(jìn)行數(shù)據(jù)的關(guān)聯(lián)查詢操作,具體確定方法如下:
[0023]對于每對具有相同索引號的子表,所述應(yīng)用服務(wù)器根據(jù)所述關(guān)聯(lián)關(guān)系,按照母表替換為子表的方式,得到該對子表的關(guān)聯(lián)關(guān)系。所述母表即被拆分的表。
[0024]在具體實現(xiàn)時,表之間的關(guān)聯(lián)關(guān)系是通過SQL語句進(jìn)行描述的,根據(jù)表的關(guān)聯(lián)關(guān)系得到子表的關(guān)聯(lián)關(guān)系,也就是通過對表的關(guān)聯(lián)關(guān)系的SQL語句進(jìn)行修改,得到相應(yīng)子表的關(guān)聯(lián)關(guān)系。由于在上述方法中,散列方式相同,相同索引號的子表在相同的服務(wù)器上,因此在進(jìn)行修改時,只需要修改SQL語句中數(shù)據(jù)表的名稱,即將其中的數(shù)據(jù)表替換為相應(yīng)的子表的名稱即可。
[0025]步驟103、當(dāng)客戶端觸發(fā)根據(jù)所述兩個表的關(guān)聯(lián)關(guān)系進(jìn)行數(shù)據(jù)查詢時,對于滿足查詢條件的子表,將該子表對應(yīng)的關(guān)聯(lián)關(guān)系發(fā)送給子表所在數(shù)據(jù)庫服務(wù)器,觸發(fā)所述數(shù)據(jù)庫服務(wù)器根據(jù)該關(guān)聯(lián)關(guān)系,按照所述查詢條件進(jìn)行查詢,并返回結(jié)果給所述應(yīng)用服務(wù)器。
[0026]這里,由于相關(guān)聯(lián)的子表在同一服務(wù)器上,因此,數(shù)據(jù)庫服務(wù)器可以在本機(jī)上行簡單的查詢合并處理,從而避免了跨機(jī)查詢的諸多開銷。
[0027]步驟104、所述應(yīng)用服務(wù)器根據(jù)所述查詢條件,對所述返回結(jié)果進(jìn)行相應(yīng)的查詢處理并反饋結(jié)果給所述客戶端。
[0028]本步驟具體實現(xiàn)時需要考慮查詢條件中包含需要二次合并處理的關(guān)鍵字,如果有,則需要在接收到所有返回結(jié)果后,對它們進(jìn)行相應(yīng)的二次合并處理,以完成最終的數(shù)據(jù)查詢操作,如果沒有,則數(shù)據(jù)庫服務(wù)器的返回結(jié)果即為最終查詢結(jié)果,直接反饋給客戶端即可。具體地,可以采用下述方法實現(xiàn):
[0029]當(dāng)所述查詢條件中包含需要二次合并處理的關(guān)鍵字時,所述應(yīng)用服務(wù)器根據(jù)所述查詢條件,對所有所述數(shù)據(jù)庫服務(wù)器的返回結(jié)果進(jìn)行相應(yīng)的合并處理,并將處理結(jié)果發(fā)送給所述客戶端;
[0030]當(dāng)所述查詢條件中不包含需要二次合并處理的關(guān)鍵字時,所述應(yīng)用服務(wù)器將接收到的所述返回結(jié)果直接發(fā)送給所述客戶端。
[0031]在實際應(yīng)用中,對于SQL系統(tǒng),所述需要二次合并處理的關(guān)鍵字包括:UN10N,MAX,MIN, AVG, GROUP, ORDER 和 HAVING 等。
[0032]這里,由于在步驟103中數(shù)據(jù)庫服務(wù)器已完成了大部分的數(shù)據(jù)關(guān)聯(lián)查詢操作,因此,在本步驟中應(yīng)用服務(wù)器只需要進(jìn)行二次合并處理,對于不需要二次合并處理的查詢,直接將結(jié)果發(fā)給客戶端即可,從而使應(yīng)用服務(wù)器的運(yùn)算負(fù)荷可以得到大幅度的降低。
[0033]綜上所述,以上僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種數(shù)據(jù)查詢方法,其特征在于,包括: 當(dāng)應(yīng)用服務(wù)器對數(shù)據(jù)庫系統(tǒng)中的數(shù)據(jù)進(jìn)行存儲時,對于存在關(guān)聯(lián)關(guān)系的兩個表,根據(jù)所述關(guān)聯(lián)關(guān)系的關(guān)聯(lián)字段,對每個所述表進(jìn)行水平拆分,得到該表的N個子表; 對于所述兩個表,所述應(yīng)用服務(wù)器根據(jù)子表的索引號,利用相同的散列公式,確定用于存儲各自子表的數(shù)據(jù)庫服務(wù)器;將各所述子表存儲在所確定的數(shù)據(jù)庫服務(wù)器中;對于所述兩個表的每對具有相同索引號的子表,所述應(yīng)用服務(wù)器根據(jù)所述關(guān)聯(lián)關(guān)系,確定該對子表的關(guān)聯(lián)關(guān)系; 當(dāng)客戶端觸發(fā)根據(jù)所述兩個表的關(guān)聯(lián)關(guān)系進(jìn)行數(shù)據(jù)查詢時,對于滿足查詢條件的子表,將該子表對應(yīng)的關(guān)聯(lián)關(guān)系發(fā)送給子表所在數(shù)據(jù)庫服務(wù)器,觸發(fā)所述數(shù)據(jù)庫服務(wù)器根據(jù)該關(guān)聯(lián)關(guān)系,按照所述查詢條件進(jìn)行查詢,并返回結(jié)果給所述應(yīng)用服務(wù)器; 所述應(yīng)用服務(wù)器根據(jù)所述查詢條件,對所述返回結(jié)果進(jìn)行相應(yīng)的查詢處理并反饋結(jié)果給所述客戶端。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述應(yīng)用服務(wù)器根據(jù)所述查詢條件,對所述返回結(jié)果進(jìn)行相應(yīng)的查詢處理并反饋結(jié)果給所述客戶端包括: 當(dāng)所述查詢條件中包含需要二次合并處理的關(guān)鍵字時,所述應(yīng)用服務(wù)器根據(jù)所述查詢條件,對所有所述數(shù)據(jù)庫服務(wù)器的返回結(jié)果進(jìn)行相應(yīng)的合并處理,并將處理結(jié)果發(fā)送給所述客戶端; 當(dāng)所述查詢條件中不包含需要二次合并處理的關(guān)鍵字時,所述應(yīng)用服務(wù)器將接收到的所述返回結(jié)果直接發(fā)送給所述客戶端。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述需要二次合并處理的關(guān)鍵字包括:UNION, MAX, MIN, AVG, GROUP, ORDER 和 HAVING。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述確定該對子表的關(guān)聯(lián)關(guān)系包括: 對于每對具有相同索引號的子表,所述應(yīng)用服務(wù)器根據(jù)所述關(guān)聯(lián)關(guān)系,按照母表替換為子表的方式,得到該對子表的關(guān)聯(lián)關(guān)系。
【文檔編號】G06F17/30GK104008199SQ201410267074
【公開日】2014年8月27日 申請日期:2014年6月16日 優(yōu)先權(quán)日:2014年6月16日
【發(fā)明者】王 鋒, 唐超, 馬麗偉, 秦波, 趙曉平 申請人:北京京東尚科信息技術(shù)有限公司, 北京京東世紀(jì)貿(mào)易有限公司