專利名稱:一種對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的方法及其系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及分布式信息處理技術(shù)領(lǐng)域,尤其涉及一種對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的方法及其系統(tǒng)。
背景技術(shù):
分布式順序表(Distributed Ordered Table簡(jiǎn)稱DOT)是一種最適用于海量數(shù)據(jù)(TB到PB級(jí))下多維區(qū)間查詢的數(shù)據(jù)庫(kù)系統(tǒng)。在分布式順序表上進(jìn)行多維區(qū)間查詢時(shí),通常直接掃描全表篩選出滿足條件的數(shù)據(jù)。在數(shù)據(jù)量非常大的時(shí)候,這種方法的查詢速度緩慢,并且使系統(tǒng)負(fù)載很大,響應(yīng)時(shí)間過長(zhǎng)不能滿足目前網(wǎng)絡(luò)應(yīng)用對(duì)海量數(shù)據(jù)進(jìn)行實(shí)時(shí)檢索的需求。
發(fā)明內(nèi)容
本發(fā)明的主要目的即基于分布式順序表構(gòu)建索引,使其能夠滿足多維區(qū)間查詢時(shí)的高性能、低存儲(chǔ)開銷和高可靠性要求。為達(dá)此目的,本發(fā)明采用以下技術(shù)方案本發(fā)明提出了一種對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的方法,包括分別為所述分布式順序表的每個(gè)索引列創(chuàng)建一張對(duì)應(yīng)的二級(jí)索引表,各索引列對(duì)應(yīng)的二級(jí)索引表包括該索引列信息、所述分布式順序表的主鍵信息;當(dāng)接收到區(qū)間查詢請(qǐng)求時(shí),依據(jù)所述查詢請(qǐng)求中查詢條件對(duì)應(yīng)的字段名稱,從各所述二級(jí)索引表中查找所述字段名稱對(duì)應(yīng)的二級(jí)索引表,依據(jù)所述查詢請(qǐng)求的查詢條件,從所述對(duì)應(yīng)的二級(jí)索引表中查找符合所述條件的記錄,從各記錄中讀出該記錄對(duì)應(yīng)的主鍵值,依據(jù)所述主鍵值直接從所述分布式順序表中讀取相應(yīng)的數(shù)據(jù)。進(jìn)一步地,各所述二級(jí)索引表的主鍵為該二級(jí)索引表對(duì)應(yīng)的索引列、所述分布式順序表的主鍵和該索引列的長(zhǎng)度三者的拼接值,或者,各所述二級(jí)索引表的主鍵為該二級(jí)索引表對(duì)應(yīng)的索引列、所述分布式順序表的主鍵和所述分布式順序表的主鍵的長(zhǎng)度三者的拼接值。進(jìn)一步地,當(dāng)接收到區(qū)間查詢請(qǐng)求時(shí),首先對(duì)所述查詢請(qǐng)求中的查詢條件進(jìn)行合并去重預(yù)處理,將預(yù)處理結(jié)果轉(zhuǎn)化為析取式,從合取子式中選擇結(jié)果集最小的子查詢作為所述區(qū)間查詢請(qǐng)求的查詢條件。進(jìn)一步地,所述從合取子式中選擇結(jié)果集最小的子查詢的方法包括分別根據(jù)各合取子式中每個(gè)分片的起止主鍵,計(jì)算各合取子式的查詢范圍所覆蓋的分片數(shù)量,選擇分片數(shù)量最少的合取子式的結(jié)果集。進(jìn)一步地,還包括當(dāng)需要進(jìn)行數(shù)據(jù)更新時(shí),首先將更新寫入日志中,然后再分別更新所述分布式順序表和索引表;當(dāng)出現(xiàn)故障使部分?jǐn)?shù)據(jù)丟失,使所述分布式順序表和索引表數(shù)據(jù)不一致時(shí),依據(jù)所述日志進(jìn)行數(shù)據(jù)恢復(fù)。根據(jù)同一發(fā)明構(gòu)思,本發(fā)明還提供了一種對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的系統(tǒng),包括索引表建立模塊,用于分別為所述分布式順序表的每個(gè)索引列創(chuàng)建一張對(duì)應(yīng)的二級(jí)索引表,各索引列對(duì)應(yīng)的二級(jí)索引表包括該索引列信息、所述分布式順序表的主鍵信息;區(qū)間查詢模塊,用于當(dāng)接收到區(qū)間查詢請(qǐng)求時(shí),依據(jù)所述查詢請(qǐng)求中查詢條件對(duì)應(yīng)的字段名稱,從各所述二級(jí)索引表中查找所述字段名稱對(duì)應(yīng)的二級(jí)索引表,依據(jù)所述查詢請(qǐng)求的查詢條件,從所述對(duì)應(yīng)的二級(jí)索引表中查找符合所述條件的記錄,從各記錄中讀出該記錄對(duì)應(yīng)的主鍵值,依據(jù)所述主鍵值直接從所述分布式順序表中讀取相應(yīng)的數(shù)據(jù)。進(jìn)一步地,各所述二級(jí)索引表的主鍵為該二級(jí)索引表對(duì)應(yīng)的索引列、所述分布式順序表的主鍵和該索引列的長(zhǎng)度三者的拼接值,或者,各所述二級(jí)索引表的主鍵為該二級(jí)索引表對(duì)應(yīng)的索引列、所述分布式順序表的主鍵和所述分布式順序表的主鍵的長(zhǎng)度三者的拼接值。進(jìn)一步地,還包括分片信息預(yù)估優(yōu)化查詢模塊,用于當(dāng)接收到區(qū)間查詢請(qǐng)求時(shí),首先對(duì)所述查詢請(qǐng)求中的查詢條件進(jìn)行合并去重預(yù)處理,將預(yù)處理結(jié)果轉(zhuǎn)化為析取式,從合取子式中選擇結(jié)果集最小的子查詢作為所述區(qū)間查詢請(qǐng)求的查詢條件。進(jìn)一步地,所述分片信息預(yù)估優(yōu)化查詢模塊中從合取子式中選擇結(jié)果集最小的子查詢作為所述區(qū)間查詢請(qǐng)求的查詢條件包括分別根據(jù)各合取子式中每個(gè)分片的起止主鍵,計(jì)算各合取子式的查詢范圍所覆蓋的分片數(shù)量,選擇分片數(shù)量最少的合取子式的結(jié)果集。進(jìn)一步地,還包括日志模塊,用于當(dāng)需要進(jìn)行數(shù)據(jù)更新時(shí),首先將更新寫入日志中,然后再分別更新所述分布式順序表和索引表;當(dāng)出現(xiàn)故障使部分?jǐn)?shù)據(jù)丟失,使所述分布式順序表和索引表數(shù)據(jù)不一致時(shí),依據(jù)所述日志進(jìn)行數(shù)據(jù)恢復(fù)。本發(fā)明能大幅增加多維區(qū)間查詢的速度,能夠同時(shí)滿足高性能、低存儲(chǔ)開銷和高可靠性的要求。
圖1是本發(fā)明具體實(shí)施例一所述的對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的方法流程圖;圖2是本發(fā)明具體實(shí)施例一所述的對(duì)分布式順序表建立的二級(jí)索引表的示意圖;圖3是本發(fā)明具體實(shí)施例三所述的對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的系統(tǒng)結(jié)構(gòu)框圖。
具體實(shí)施例方式下面結(jié)合附圖并通過具體實(shí)施方式
來進(jìn)一步說明本發(fā)明的技術(shù)方案。實(shí)施例一圖1是本發(fā)明具體實(shí)施例一所述的對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的方法流程圖,如圖1所示,本實(shí)施例具體方法包括
S101、為各索引列創(chuàng)建二級(jí)索引表;分布式順序表所存儲(chǔ)的數(shù)據(jù)按主鍵被水平劃分為多個(gè)分片(Region),每個(gè)分片存儲(chǔ)一段按照主鍵排序的數(shù)據(jù),同時(shí)將分片分配到多個(gè)分片服務(wù)器(RegionServer)上,支持按主鍵進(jìn)行高速點(diǎn)查詢和區(qū)間查詢,支持高速隨機(jī)數(shù)據(jù)讀寫。每張表可有一個(gè)或多個(gè)列,支持按列投影等操作。當(dāng)數(shù)據(jù)查詢時(shí),查詢條件經(jīng)常會(huì)指定一列或多列來給定,這些經(jīng)常用作查詢條件的一列或多列,通過對(duì)之前的查詢條件進(jìn)行統(tǒng)計(jì),或依據(jù)分布式順序表的結(jié)構(gòu)特征的分析,可指定所述分布式順序表中至少一個(gè)非主鍵的列作為索引列,用于分別基于這些列創(chuàng)建二級(jí)索引表。分別為分布式順序表的每個(gè)索引列創(chuàng)建一張對(duì)應(yīng)的二級(jí)索引表,各索引列對(duì)應(yīng)的二級(jí)索引表必須包括該索引列信息、所述分布式順序表的主鍵信息,可有多種組織方式。例如,各所述二級(jí)索引表的主鍵為該二級(jí)索引表對(duì)應(yīng)的索引列、所述分布式順序表的主鍵和該索引列的長(zhǎng)度三者的拼接值;或者,各所述二級(jí)索引表的主鍵為該二級(jí)索引表對(duì)應(yīng)的索引列、所述分布式順序表的主鍵和所述分布式順序表的主鍵的長(zhǎng)度三者的拼接值。圖2是本實(shí)施例所述的對(duì)分布式順序表建立的二級(jí)索引表的示意圖,如圖2所示,分布式順序表(又稱為原表)100包含列id,idxl,idx2和info,其中,id表示原表的主鍵,idxl和idx2為兩個(gè)索引列,info為其他的數(shù)據(jù)內(nèi)容的一列或多列。本示意圖中為每個(gè)索引列分別創(chuàng)建索引表的方法為各所述二級(jí)索引表的主鍵為該二級(jí)索引表對(duì)應(yīng)的索引列、所述分布式順序表的主鍵和該索引列的長(zhǎng)度三者的拼接值。參見圖2,為所述分布式順序表100的兩個(gè)索引列idxl和idx2分別創(chuàng)建索引表101和102,其中,索引表101的主鍵keyl由當(dāng)前索引列idxl、原表的主鍵值id、以及當(dāng)前索引列idxl的長(zhǎng)度值idxlLength順序拼接而成,索引表102的主鍵key2由當(dāng)前索引列idx2、原表的主鍵值id、以及當(dāng)前索引列idx2的長(zhǎng)度值idx2Length順序拼接而成。這種方式使得索引表先按列值排序再按原主鍵排序,同時(shí),通過對(duì)索引列值的長(zhǎng)度的記載,可以從新主鍵中得到原主鍵和索引列值,即使索引列重復(fù)也能具有唯一的新主鍵。S102、依據(jù)查詢請(qǐng)求的字段名稱,找到對(duì)應(yīng)的二級(jí)索引表;當(dāng)需要對(duì)索引列進(jìn)行區(qū)間查詢時(shí),連續(xù)掃描與該索引列對(duì)應(yīng)的所述索引表,找到與該索引列相關(guān)的所有二級(jí)索引。S103、依據(jù)查詢條件,從二級(jí)索引表中查找符合條件的記錄;根據(jù)所找到的二級(jí)索引表,從所述二級(jí)索引表中查找符合條件的記錄。S104、從各記錄中讀出對(duì)應(yīng)的主鍵值;由于每個(gè)二級(jí)索引表中每一條記錄均記載了索引列信息和對(duì)應(yīng)的分布式順序表的主鍵信息,所以,從所述二級(jí)索引表中查找符合條件的記錄后,可在記錄中查找該記錄在對(duì)應(yīng)的分布式順序表的主鍵值。S105、依據(jù)主鍵值直接從分布式順序表中讀取相應(yīng)的數(shù)據(jù)。通過主鍵值,直接從分布式順序表中讀取相應(yīng)的數(shù)據(jù)。實(shí)施例二
為了進(jìn)一步優(yōu)化對(duì)分布式順序表的區(qū)間查詢,當(dāng)需要對(duì)索引列進(jìn)行區(qū)間查詢時(shí),在實(shí)施例一的步驟S102之前還可以進(jìn)一步包括分片信息預(yù)估優(yōu)化查詢步驟;為了保證所述分布式順序表和索引表中的數(shù)據(jù)始終能保持一致,當(dāng)需要對(duì)分布式順序表進(jìn)行更新時(shí),本發(fā)明還可以包括步一致性更新步驟。分片信息預(yù)估優(yōu)化查詢步驟當(dāng)需要對(duì)索引列進(jìn)行區(qū)間查詢時(shí),對(duì)查詢計(jì)劃樹進(jìn)行合并去重預(yù)處理,然后將查詢邏輯轉(zhuǎn)化為析取式后并行執(zhí)行,執(zhí)行時(shí)從合取子式中選擇結(jié)果集最小的子查詢來執(zhí)行,而其它子查詢以謂詞形式對(duì)結(jié)果集進(jìn)行過濾。其中,選擇結(jié)果集最小的子查詢時(shí)利用分布式順序表中存儲(chǔ)的數(shù)據(jù)分片信息,根據(jù)每個(gè)分片的起止主鍵,計(jì)算查詢范圍覆蓋的分片數(shù)量,由此即可估算出結(jié)果集大小,最后挑選結(jié)果集最小的子查詢執(zhí)行查詢過程。下面描述查詢處理和優(yōu)化的具體過程首先將查詢串轉(zhuǎn)換為查詢計(jì)劃樹,樹的每個(gè)葉子節(jié)點(diǎn)是查詢系統(tǒng)能直接處理的點(diǎn)查詢和單個(gè)維度的區(qū)間查詢,樹的非葉子節(jié)點(diǎn)表示多個(gè)查詢的邏輯關(guān)系。之后對(duì)查詢計(jì)劃樹進(jìn)行預(yù)處理,執(zhí)行一些簡(jiǎn)單的合并去重優(yōu)化。然后估算結(jié)果集大小,估算子查詢結(jié)果集的大小具體包括步驟S1031,對(duì)于每個(gè)給定的區(qū)間查詢,由其起始鍵值和結(jié)束鍵值通過對(duì)元信息中數(shù)據(jù)的查找確定此區(qū)間查詢覆蓋的分片數(shù)量;步驟S1032,累加全部分片的大小,獲得估算的結(jié)果集大小。最后,查詢執(zhí)行時(shí),對(duì)計(jì)劃樹中“或關(guān)系”的子查詢并行執(zhí)行,而對(duì)“與關(guān)系”的子查詢,選擇結(jié)果集最小的一個(gè)實(shí)施查詢,其它查詢條件作為謂詞。查詢優(yōu)化的關(guān)鍵是估算結(jié)果集大小,由于DOT系統(tǒng)的數(shù)據(jù)量極大,而查詢所需時(shí)間與結(jié)果集字節(jié)大小正相關(guān),所以從多維屬性中選取結(jié)果集最小的屬性進(jìn)行掃描操作可以極大地優(yōu)化查詢性能。本發(fā)明利用了 DOT表中主結(jié)點(diǎn)(master)管理的數(shù)據(jù)分布信息進(jìn)行結(jié)果集的預(yù)估,提高了區(qū)間查詢的性能。進(jìn)行一致性更新步驟當(dāng)需要對(duì)分布式順序表進(jìn)行更新時(shí),本發(fā)明還可以包括步一致性更新步驟。具體為在更新一條數(shù)據(jù)之前,首先將更新寫入日志中,然后再分別更新所述分布式順序表和索引表,更新時(shí)需遵循原子性操作要求二維索引表的更新,即要么都更新,要么都不更新。相應(yīng)的,當(dāng)由于出現(xiàn)故障而導(dǎo)致部分?jǐn)?shù)據(jù)丟失,使所述分布式順序表和索引表數(shù)據(jù)不一致的時(shí)候,通過寫前日志來恢復(fù)丟失的數(shù)據(jù)。在具體軟件實(shí)現(xiàn)時(shí),可基于Apache HBase來創(chuàng)建本發(fā)明所述的二級(jí)索引系統(tǒng)。HBase基于典型的分布式順序表,構(gòu)建于Apache HDFS,提供一個(gè)服務(wù)節(jié)點(diǎn)進(jìn)程HMaster,并提供多個(gè)數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)進(jìn)程HRegionServer來管理數(shù)據(jù)。二級(jí)索引系統(tǒng)采用HBasev0. 90. 2作為代碼基礎(chǔ),采用Java語言實(shí)現(xiàn),在HBase中為每個(gè)索引列創(chuàng)建一張索引表,作為二級(jí)索引表。另外,HBase有一個(gè)元數(shù)據(jù)表,用于存儲(chǔ)用戶數(shù)據(jù)表的分片到存儲(chǔ)節(jié)點(diǎn)的映射關(guān)系,二級(jí)索引系統(tǒng)通過掃描HBase中的元數(shù)據(jù)表,可以利用分片映射信息來估算結(jié)果集大小。以ApacheHBase作為基礎(chǔ),可以充分利用Apache Hadoop分布式存儲(chǔ)技術(shù)現(xiàn)有的架構(gòu)及代碼,從而能夠高效地構(gòu)建本發(fā)明的二級(jí)索引系統(tǒng)。實(shí)施例三
根據(jù)同一構(gòu)思,本發(fā)明還提供了一種對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的系統(tǒng),圖3是本實(shí)施例所述的對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的系統(tǒng)結(jié)構(gòu)框圖。如圖3所示,本實(shí)施例所述的對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的系統(tǒng)包括索引表建立模塊301,用于在分布式順序表上建立索引表,其中為所述分布式順序表的每個(gè)索弓I列分別創(chuàng)建一張索弓I表,將所述分布式順序表的索引列值、主鍵值、索引列值的長(zhǎng)度順序拼接在一起作為所述索引表的主鍵,該主鍵即為所述分布式順序表的二級(jí)索弓I ;當(dāng)數(shù)據(jù)查詢時(shí),查詢條件經(jīng)常會(huì)指定一列或多列來給定,這些經(jīng)常用作查詢條件的一列或多列,通過對(duì)之前的查詢條件進(jìn)行統(tǒng)計(jì),或依據(jù)分布式順序表的結(jié)構(gòu)特征的分析,可指定所述分布式順序表中至少一個(gè)非主鍵的列作為索引列,用于分別基于這些列創(chuàng)建二級(jí)索引表。索引表建立模塊301用于分別為分布式順序表的每個(gè)索引列創(chuàng)建一張對(duì)應(yīng)的二級(jí)索引表,各索引列對(duì)應(yīng)的二級(jí)索引表必須包括該索引列信息、所述分布式順序表的主鍵信息,可有多種組織方式。例如,各所述二級(jí)索引表的主鍵為該二級(jí)索引表對(duì)應(yīng)的索引列、所述分布式順序表的主鍵和該索引列的長(zhǎng)度三者的拼接值;或者,各所述二級(jí)索引表的主鍵為該二級(jí)索引表對(duì)應(yīng)的索引列、所述分布式順序表的主鍵和所述分布式順序表的主鍵的長(zhǎng)度三者的拼接值。本實(shí)施例優(yōu)選的為每個(gè)索引列分別創(chuàng)建索引表的方法為各所述二級(jí)索引表的主鍵為該二級(jí)索引表對(duì)應(yīng)的索引列、所述分布式順序表的主鍵和該索引列的長(zhǎng)度三者的拼接值。這種方式使得索引表先按列值排序再按原主鍵排序,同時(shí),通過對(duì)索引列值的長(zhǎng)度的記載,可以從新主鍵中得到原主鍵和索引列值,即使索引列重復(fù)也能具有唯一的新主鍵。區(qū)間查詢模塊302,用于對(duì)索引列進(jìn)行區(qū)間查詢,其中連續(xù)掃描與該索引列對(duì)應(yīng)的所述索引表,找到與該索引列相關(guān)的所有二級(jí)索引,然后根據(jù)所找到的二級(jí)索引直接從所述分布式順序表中讀取相應(yīng)的數(shù)據(jù)。當(dāng)需要對(duì)索引列進(jìn)行區(qū)間查詢時(shí),連續(xù)掃描與該索引列對(duì)應(yīng)的所述索引表,找到與該索引列相關(guān)的所有二級(jí)索引。根據(jù)所找到的二級(jí)索引表,從所述二級(jí)索弓I表中查找符合條件的記錄。由于每個(gè)二級(jí)索引表中每一條記錄均記載了索引列信息和對(duì)應(yīng)的分布式順序表的主鍵信息,所以,從所述二級(jí)索引表中查找符合條件的記錄后,可在記錄中查找該記錄在對(duì)應(yīng)的分布式順序表的主鍵值。通過主鍵值,就可直接從分布式順序表中讀取相應(yīng)的數(shù)據(jù)。分片信息預(yù)估優(yōu)化查詢模塊303,用于當(dāng)接收到區(qū)間查詢請(qǐng)求時(shí),首先對(duì)所述查詢請(qǐng)求中的查詢條件進(jìn)行合并去重預(yù)處理,將預(yù)處理結(jié)果轉(zhuǎn)化為析取式,從合取子式中選擇結(jié)果集最小的子查詢作為所述區(qū)間查詢請(qǐng)求的查詢條件。為了進(jìn)一步優(yōu)化對(duì)分布式順序表的區(qū)間查詢,本發(fā)明還可以進(jìn)一步包括,用于對(duì)查詢計(jì)劃樹進(jìn)行合并去重預(yù)處理,然后將查詢邏輯轉(zhuǎn)化為析取式后并行執(zhí)行,執(zhí)行時(shí)從析取式中選擇結(jié)果集最小的子查詢來執(zhí)行,而其它子查詢以謂詞形式對(duì)結(jié)果集進(jìn)行過濾。其中,所述分片信息預(yù)估優(yōu)化查詢模塊在選擇結(jié)果集最小的子查詢時(shí)利用分布式順序表中存儲(chǔ)的數(shù)據(jù)分片信息,根據(jù)每個(gè)分片的起止主鍵,計(jì)算查詢范圍覆蓋的分片數(shù)量,由此估算結(jié)果集大小。日志模塊304,用于當(dāng)需要進(jìn)行數(shù)據(jù)更新時(shí),首先將更新寫入日志中,然后再分別更新所述分布式順序表和索引表;當(dāng)出現(xiàn)故障使部分?jǐn)?shù)據(jù)丟失,使所述分布式順序表和索引表數(shù)據(jù)不一致時(shí),依據(jù)所述日志進(jìn)行數(shù)據(jù)恢復(fù)。為了保證所述分布式順序表和索引表中的數(shù)據(jù)始終能保持一致,本發(fā)明還可以進(jìn)一步包括日志模塊304,用于在更新一條數(shù)據(jù)之前首先將更新寫入日志中,然后再分別更新所述分布式順序表和索引表。更新時(shí)需遵循原子性操作要求進(jìn)行這兩個(gè)表的更新,即要么都更新,要么都不更新。相應(yīng)的,當(dāng)由于出現(xiàn)故障而導(dǎo)致部分?jǐn)?shù)據(jù)丟失,使所述分布式順序表和索引表數(shù)據(jù)不一致的時(shí)候,通過寫前日志來恢復(fù)丟失的數(shù)據(jù)。在具體軟件實(shí)現(xiàn)時(shí),可基于Apache HBase來創(chuàng)建本發(fā)明所述的二級(jí)索引系統(tǒng)。HBase基于典型的分布式順序表,構(gòu)建于Apache HDFS,提供一個(gè)服務(wù)節(jié)點(diǎn)進(jìn)程HMaster,并提供多個(gè)數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)進(jìn)程HRegionServer來管理數(shù)據(jù)。二級(jí)索引系統(tǒng)采用HBasev0. 90. 2作為代碼基礎(chǔ),采用Java語言實(shí)現(xiàn),在HBase中為每個(gè)索引列創(chuàng)建一張索引表,作為二級(jí)索引表。另外,HBase有一個(gè)元數(shù)據(jù)表,用于存儲(chǔ)用戶數(shù)據(jù)表的分片到存儲(chǔ)節(jié)點(diǎn)的映射關(guān)系,二級(jí)索引系統(tǒng)通過掃描HBase中的元數(shù)據(jù)表,可以利用分片映射信息來估算結(jié)果集大小。以ApacheHBase作為基礎(chǔ),可以充分利用Apache Hadoop分布式存儲(chǔ)技術(shù)現(xiàn)有的架構(gòu)及代碼,從而能夠高效地構(gòu)建本發(fā)明的二級(jí)索引系統(tǒng)。本發(fā)明在僅增加少量存儲(chǔ)開銷用于存儲(chǔ)二級(jí)索引表的情況下,能大幅增加多維區(qū)間查詢的速度,能夠同時(shí)滿足高性能、低存儲(chǔ)開銷和高可靠性的要求。以上實(shí)施例提供的技術(shù)方案中的全部或部分內(nèi)容可以通過軟件編程實(shí)現(xiàn),其軟件程序存儲(chǔ)在可讀取的存儲(chǔ)介質(zhì)中,存儲(chǔ)介質(zhì)例如計(jì)算機(jī)中的硬盤、光盤或軟盤。 以上所述僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的方法,其特征在于,包括分別為所述分布式順序表的每個(gè)索引列創(chuàng)建一張對(duì)應(yīng)的二級(jí)索引表,各索引列對(duì)應(yīng)的二級(jí)索引表包括該索引列信息、所述分布式順序表的主鍵信息;當(dāng)接收到區(qū)間查詢請(qǐng)求時(shí),依據(jù)所述查詢請(qǐng)求中查詢條件對(duì)應(yīng)的字段名稱,從各所述二級(jí)索引表中查找所述字段名稱對(duì)應(yīng)的二級(jí)索引表,依據(jù)所述查詢請(qǐng)求的查詢條件,從所述對(duì)應(yīng)的二級(jí)索引表中查找符合所述條件的記錄,從各記錄中讀出該記錄對(duì)應(yīng)的主鍵值,依據(jù)所述主鍵值直接從所述分布式順序表中讀取相應(yīng)的數(shù)據(jù)。
2.如權(quán)利要求1所述的對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的方法,其特征在于,各所述二級(jí)索引表的主鍵為該二級(jí)索引表對(duì)應(yīng)的索引列、所述分布式順序表的主鍵和該索引列的長(zhǎng)度三者的拼接值,或者,各所述二級(jí)索引表的主鍵為該二級(jí)索引表對(duì)應(yīng)的索引列、所述分布式順序表的主鍵和所述分布式順序表的主鍵的長(zhǎng)度三者的拼接值。
3.如權(quán)利要求1或2所述的對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的方法,其特征在于,當(dāng)接收到區(qū)間查詢請(qǐng)求時(shí),首先對(duì)所述查詢請(qǐng)求中的查詢條件進(jìn)行合并去重預(yù)處理,將預(yù)處理結(jié)果轉(zhuǎn)化為析取式,從合取子式中選擇結(jié)果集最小的子查詢作為所述區(qū)間查詢請(qǐng)求的查詢條件。
4.如權(quán)利要求3所述的對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的方法,其特征在于,所述從合取子式中選擇結(jié)果集最小的子查詢的方法包括分別根據(jù)各合取子式中每個(gè)分片的起止主鍵,計(jì)算各合取子式的查詢范圍所覆蓋的分片數(shù)量,選擇分片數(shù)量最少的合取子式的結(jié)果集。
5.如權(quán)利要求1所述的對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的方法,其特征在于,還包括當(dāng)需要進(jìn)行數(shù)據(jù)更新時(shí),首先將更新寫入日志中,然后再分別更新所述分布式順序表和索引表;當(dāng)出現(xiàn)故障使部分?jǐn)?shù)據(jù)丟失,使所述分布式順序表和索引表數(shù)據(jù)不一致時(shí),依據(jù)所述日志進(jìn)行數(shù)據(jù)恢復(fù)。
6.一種對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的系統(tǒng),其特征在于,包括索引表建立模塊,用于分別為所述分布式順序表的每個(gè)索引列創(chuàng)建一張對(duì)應(yīng)的二級(jí)索引表,各索引列對(duì)應(yīng)的二級(jí)索引表包括該索引列信息、所述分布式順序表的主鍵信息;區(qū)間查詢模塊,用于當(dāng)接收到區(qū)間查詢請(qǐng)求時(shí),依據(jù)所述查詢請(qǐng)求中查詢條件對(duì)應(yīng)的字段名稱,從各所述二級(jí)索引表中查找所述字段名稱對(duì)應(yīng)的二級(jí)索引表,依據(jù)所述查詢請(qǐng)求的查詢條件,從所述對(duì)應(yīng)的二級(jí)索引表中查找符合所述條件的記錄,從各記錄中讀出該記錄對(duì)應(yīng)的主鍵值,依據(jù)所述主鍵值直接從所述分布式順序表中讀取相應(yīng)的數(shù)據(jù)。
7.如權(quán)利要求6所述的對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的系統(tǒng),其特征在于,各所述二級(jí)索引表的主鍵為該二級(jí)索引表對(duì)應(yīng)的索引列、所述分布式順序表的主鍵和該索引列的長(zhǎng)度三者的拼接值,或者,各所述二級(jí)索引表的主鍵為該二級(jí)索引表對(duì)應(yīng)的索引列、所述分布式順序表的主鍵和所述分布式順序表的主鍵的長(zhǎng)度三者的拼接值。
8.如權(quán)利要求6或7所述的對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的系統(tǒng),其特征在于,還包括分片信息預(yù)估優(yōu)化查詢模塊,用于當(dāng)接收到區(qū)間查詢請(qǐng)求時(shí),首先對(duì)所述查詢請(qǐng)求中的查詢條件進(jìn)行合并去重預(yù)處理,將預(yù)處理結(jié)果轉(zhuǎn)化為析取式,從合取子式中選擇結(jié)果集最小的子查詢作為所述區(qū)間查詢請(qǐng)求的查詢條件。
9.如權(quán)利要求8所述的對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的系統(tǒng),其特征在于,所述分片信息預(yù)估優(yōu)化查詢模塊中從合取子式中選擇結(jié)果集最小的子查詢作為所述區(qū)間查詢請(qǐng)求的查詢條件包括分別根據(jù)各合取子式中每個(gè)分片的起止主鍵,計(jì)算各合取子式的查詢范圍所覆蓋的分片數(shù)量,選擇分片數(shù)量最少的合取子式的結(jié)果集。
10.如權(quán)利要求6所述的對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的系統(tǒng),其特征在于,還包括日志模塊,用于當(dāng)需要進(jìn)行數(shù)據(jù)更新時(shí),首先將更新寫入日志中,然后再分別更新所述分布式順序表和索引表;當(dāng)出現(xiàn)故障使部分?jǐn)?shù)據(jù)丟失,使所述分布式順序表和索引表數(shù)據(jù)不一致時(shí),依據(jù)所述日志進(jìn)行數(shù)據(jù)恢復(fù)。
全文摘要
本發(fā)明公開了一種對(duì)分布式順序表進(jìn)行多維區(qū)間查詢的方法及其系統(tǒng),其中方法包括分別為所述分布式順序表的每個(gè)索引列創(chuàng)建一張對(duì)應(yīng)的二級(jí)索引表,各索引列對(duì)應(yīng)的二級(jí)索引表的主鍵為該索引列值、所述分布式順序表的主鍵值和該索引列值的長(zhǎng)度三者的拼接值;當(dāng)接收到區(qū)間查詢請(qǐng)求時(shí),依據(jù)所述查詢請(qǐng)求的字段名稱,從各所述二級(jí)索引表中查找所述字段名稱對(duì)應(yīng)的二級(jí)索引表,依據(jù)所述查詢請(qǐng)求的字段值,從所述對(duì)應(yīng)的二級(jí)索引表中查找所述查詢請(qǐng)求字段值對(duì)應(yīng)的記錄位置,直接從所述分布式順序表中的該記錄位置讀取相應(yīng)的數(shù)據(jù)。本發(fā)明能大幅增加多維區(qū)間查詢的速度,能夠同時(shí)滿足高性能、低存儲(chǔ)開銷和高可靠性的要求。
文檔編號(hào)G06F17/30GK103020204SQ201210517589
公開日2013年4月3日 申請(qǐng)日期2012年12月5日 優(yōu)先權(quán)日2012年12月5日
發(fā)明者劉佳, 谷靖宇, 查禮 申請(qǐng)人:北京普澤天璣數(shù)據(jù)技術(shù)有限公司