專(zhuān)利名稱(chēng):一種MongoDB集群快速查詢(xún)計(jì)算的方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)集群技術(shù),尤其涉及一種MongoDB集群的快速查詢(xún)計(jì)算的方法及裝置。
背景技術(shù):
隨著信息化的進(jìn)一步加深,在各個(gè)領(lǐng)域,如電信、交通、金融、零售、航天、醫(yī)藥等,數(shù)據(jù)量級(jí)都呈現(xiàn)快速增長(zhǎng)趨勢(shì),如何高效并且無(wú)誤的存儲(chǔ)、分析、理解以及利用這些大規(guī)模數(shù)據(jù),成為一個(gè)關(guān)鍵性的問(wèn)題。為了應(yīng)對(duì)大規(guī)模數(shù)據(jù)處理的難題,數(shù)據(jù)庫(kù)集群技術(shù)應(yīng)運(yùn)而生。數(shù)據(jù)庫(kù)集群技術(shù)是將多個(gè)數(shù)據(jù)庫(kù)連在一起組成分布式數(shù)據(jù)庫(kù)集群,將海量數(shù)據(jù)“分而治之”。MongoDB作為分布式數(shù)據(jù)庫(kù)的一員,表現(xiàn)的非常優(yōu)秀。在MongoDB數(shù)據(jù)庫(kù)集群中,可以采用find語(yǔ)句查詢(xún)數(shù)據(jù),查詢(xún)結(jié)果可以采用MapReduce分布計(jì)算的方式返回查詢(xún)計(jì)算的結(jié)果。MapReduce分布式計(jì)算框架是Google公司提出的軟件架構(gòu),借鑒了函數(shù)式編程的思想,高效地進(jìn)行大規(guī)模數(shù)據(jù)集的分布式計(jì)算。MapReduce以函數(shù)的形式提供了 Map和Reduce來(lái)進(jìn)行分布式計(jì)算。Map相對(duì)獨(dú)立且并行運(yùn)行,對(duì)存儲(chǔ)系統(tǒng)中的文件按行處理,并產(chǎn)生鍵值(key/value)對(duì)。Reduce以Map的輸出作為輸入,相同key的記錄匯聚到同一 reduce,reduce對(duì)這組記錄進(jìn)行操作,并產(chǎn)生新的數(shù)據(jù)集。所有Reduce任務(wù)的輸出組成最終結(jié)果。隨著數(shù)據(jù)庫(kù)集群技術(shù)的發(fā)展,人們對(duì)其業(yè)務(wù)功能的需求也越來(lái)越高。目前的技術(shù)可以實(shí)現(xiàn)多臺(tái)MongoDB服務(wù)器之間的數(shù)據(jù)匯總,但是實(shí)現(xiàn)多臺(tái)MongoDB服務(wù)器之間的聯(lián)表分組查詢(xún)的方法很少,提出的相關(guān)專(zhuān)利有“M0NG0DB分片聯(lián)表查詢(xún)方法及裝置”。以下對(duì)該專(zhuān)利進(jìn)行說(shuō)明,該方法包括:步驟1、確定查詢(xún)條件,該查詢(xún)條件用于查詢(xún)MongoDB所有分片的指定數(shù)據(jù)表中與指定分組對(duì)應(yīng)的分組匯總信息;步驟2、確定所述指定數(shù)據(jù)表中屬于所述指定分組中任意分組的數(shù)據(jù)記錄標(biāo)識(shí),作為目標(biāo)記錄標(biāo)識(shí);步驟3、獲取所述MongoDB各個(gè)分片中的指定數(shù)據(jù)表中數(shù)據(jù)記錄標(biāo)識(shí)是各所述目標(biāo)數(shù)據(jù)記錄標(biāo)識(shí)之一的數(shù)據(jù)信息;步驟4、將所獲取的數(shù)據(jù)信息存儲(chǔ)在一臨時(shí)數(shù)據(jù)表中;步驟5、基于所述臨時(shí)數(shù)據(jù)表對(duì)所獲取的數(shù)據(jù)進(jìn)行分組匯總,得到分組匯總信息。通過(guò)以上步驟,可以實(shí)現(xiàn)多臺(tái)MongoDB服務(wù)器之間高效聯(lián)表分組查詢(xún),但是,該方案在多臺(tái)MongoDB服務(wù)器上建立臨時(shí)數(shù)據(jù)表,通過(guò)MapReduce對(duì)臨時(shí)數(shù)據(jù)表進(jìn)行分組匯總。這樣做,存在著以下缺點(diǎn):l、MapReduce支持分片數(shù)據(jù)庫(kù)查詢(xún),處理速度偏慢,MapReduce并不適用需要實(shí)時(shí)響應(yīng)的系統(tǒng);2、MapReduce相對(duì)于具有完善索引的系統(tǒng)而言,不再具有優(yōu)勢(shì),因?yàn)樗枰獙?duì)每條數(shù)據(jù)進(jìn)行匹配,并將與搜索條件相匹配的數(shù)據(jù)提取出來(lái),而如果采用索引系統(tǒng),并不需要遍歷所有數(shù)據(jù)。與MapReduce功能相近的語(yǔ)句是Group by語(yǔ)句。Groupby語(yǔ)句的查詢(xún)速度比MapReduce快很多,但是Group by語(yǔ)句只能用于一臺(tái)服務(wù)器上的數(shù)據(jù)查詢(xún)和計(jì)算,無(wú)法應(yīng)用于分布式數(shù)據(jù)庫(kù)的查詢(xún)中。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種MongoDB集群的快速查詢(xún)方法。當(dāng)用戶(hù)對(duì)分片聯(lián)表數(shù)據(jù)進(jìn)行查詢(xún)時(shí),將使用MapReduce進(jìn)行分片查詢(xún)方式改進(jìn)為一臺(tái)服務(wù)器上查詢(xún)的方式,通過(guò)這種方法大大提高了數(shù)據(jù)的查詢(xún)速度。為達(dá)此目的,本發(fā)明采用以下技術(shù)方案:—種MongoDB集群快速查詢(xún)計(jì)算的方法,所述方法包括:S1、確定查詢(xún)條件,所述查詢(xún)條件用于查詢(xún)MongoDB所有分片的指定數(shù)據(jù)表中與查詢(xún)條件對(duì)應(yīng)的指定分組的分組匯總數(shù)據(jù);S2、根據(jù)所述查詢(xún)條件,查詢(xún)所述指定數(shù)據(jù)表,獲取與所述查詢(xún)條件對(duì)應(yīng)的指定分組中的數(shù)據(jù);S3、將所述數(shù)據(jù)存儲(chǔ)在服務(wù)器上的第一臨時(shí)數(shù)據(jù)緩存表中;S4、對(duì)所述第一臨時(shí)數(shù)據(jù)緩存表中的數(shù)據(jù)進(jìn)行分組查詢(xún)并對(duì)查詢(xún)結(jié)果進(jìn)行計(jì)算。進(jìn)一步地、在所述步驟S4之后,還包括步驟S5,將步驟S4中所述的分組查詢(xún)計(jì)算的結(jié)果存儲(chǔ)在服務(wù)器上的第二臨時(shí)數(shù)據(jù)緩存表中。進(jìn)一步地、所述步驟S2中,采用find語(yǔ)句查詢(xún)所述指定數(shù)據(jù)表,獲取與所述查詢(xún)條件對(duì)應(yīng)的指定分組中的數(shù)據(jù),所述步驟S4中,采用Group by語(yǔ)句對(duì)所述第一臨時(shí)數(shù)據(jù)緩存表中的數(shù)據(jù)進(jìn)行分組查詢(xún)并對(duì)查詢(xún)結(jié)果進(jìn)行計(jì)算。進(jìn)一步地、在所述步驟S3與步驟S4之間,還包括步驟S3-1,建立所述第一數(shù)據(jù)緩存表的日志表。進(jìn)一步地、在所述步驟S2中,根據(jù)所述查詢(xún)條件,查詢(xún)所述指定數(shù)據(jù)表包括:將所述查詢(xún)條件拆分為多個(gè)區(qū)間的查詢(xún)條件。進(jìn)一步地、所述步驟S3中,將所述數(shù)據(jù)信息存儲(chǔ)在服務(wù)器的第一臨時(shí)數(shù)據(jù)緩存表中包括:將需要存儲(chǔ)的數(shù)據(jù)分為多個(gè)小塊的數(shù)據(jù)分批存儲(chǔ)。進(jìn)一步地、在所述步驟S5之后,還包括步驟S6,建立所述第二臨時(shí)數(shù)據(jù)緩存表的曰志表。進(jìn)一步地、當(dāng)所述第一臨時(shí)數(shù)據(jù)緩存表的日志表或第二臨時(shí)數(shù)據(jù)緩存表的日志表中的數(shù)據(jù)的查詢(xún)頻率低于預(yù)定頻率閾值時(shí),刪除第一臨時(shí)數(shù)據(jù)緩存表或第二臨時(shí)數(shù)據(jù)緩存表中的所述數(shù)據(jù)。進(jìn)一步地、當(dāng)所述第一臨時(shí)數(shù)據(jù)緩存表的日志表或第二臨時(shí)數(shù)據(jù)緩存表的日志表中數(shù)據(jù)的日期屬性超過(guò)過(guò)期時(shí)間閾值時(shí),刪除第一臨時(shí)數(shù)據(jù)緩存表或第二臨時(shí)數(shù)據(jù)緩存表中的對(duì)應(yīng)的數(shù)據(jù)信息。相應(yīng)地、本發(fā)明還公開(kāi)了一種MongoDB集群的快速查詢(xún)計(jì)算裝置,所述裝置包含:確定模塊,用于確定查詢(xún)條件,所述查詢(xún)條件用于查詢(xún)MongoDB所有分片的指定數(shù)據(jù)表中與查詢(xún)條件對(duì)應(yīng)的指定分組的分組匯總數(shù)據(jù);查詢(xún)模塊,用于根據(jù)所述查詢(xún)條件,查詢(xún)所述指定數(shù)據(jù)表,獲取與所述指定分組對(duì)應(yīng)的數(shù)據(jù)信息;記錄模塊,用于將所述數(shù)據(jù)信息存儲(chǔ)在服務(wù)器上的第一臨時(shí)數(shù)據(jù)緩存表中;處理模塊,用于對(duì)所述第一臨時(shí)數(shù)據(jù)緩存表中的數(shù)據(jù)信息進(jìn)行分組查詢(xún)并對(duì)查詢(xún)結(jié)果進(jìn)行計(jì)算。本發(fā)明的有益效果為,提供了一種MongoDB集群的快速查詢(xún)方法,通過(guò)對(duì)臨時(shí)緩存表存儲(chǔ)形式的修改,將在多臺(tái)服務(wù)器上存儲(chǔ)的數(shù)據(jù)在一臺(tái)服務(wù)器上集中存儲(chǔ),通過(guò)在一臺(tái)服務(wù)器上進(jìn)行數(shù)據(jù)查詢(xún)、計(jì)算,大大提高了查詢(xún)和計(jì)算的速度。
下面根據(jù)附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步詳細(xì)說(shuō)明。圖1為本發(fā)明實(shí)施例所述MongoDB集群快速查詢(xún)計(jì)算方法流程圖;圖2為本發(fā)明實(shí)施例所述的數(shù)據(jù)表、日志表及索引之間的關(guān)系示意圖;圖3為本發(fā)明實(shí)施例所述MongoDB集群快速查詢(xún)計(jì)算裝置結(jié)構(gòu)示意圖。
具體實(shí)施例方式下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步的詳細(xì)說(shuō)明??梢岳斫獾氖?,此處所描述的具體實(shí)施例僅僅用于解釋本發(fā)明,而非對(duì)本發(fā)明的限定。另外還需要說(shuō)明的是,為了便于描述,附圖中僅示出了與本發(fā)明相關(guān)的部分而非全部?jī)?nèi)容。在圖1中示出了本發(fā)明的第一實(shí)施例。圖1為根據(jù)本發(fā)明第一實(shí)施例的MongoDB集群快速查詢(xún)方法的實(shí)現(xiàn)流程,該實(shí)現(xiàn)流程100詳述如下:在步驟101中,確定查詢(xún)條件。查詢(xún)條件用于查詢(xún)MongoDB所有分片的指定數(shù)據(jù)表中與指定分組對(duì)應(yīng)的分組匯總信息??梢灾付ㄒ粋€(gè)分組,也可以指定多個(gè)分組。通常,可通過(guò)接收用戶(hù)端發(fā)來(lái)的用戶(hù)請(qǐng)求來(lái)確定查詢(xún)條件??梢酝ㄟ^(guò)網(wǎng)絡(luò)接收來(lái)自瀏覽器等用戶(hù)端發(fā)來(lái)的用戶(hù)請(qǐng)求。此外,用戶(hù)請(qǐng)求還可以用于查詢(xún)MongoDB服務(wù)器中所有分片中的指定數(shù)據(jù)表中與指定分組對(duì)應(yīng)且滿足預(yù)設(shè)條件的數(shù)據(jù)。例如:在一段時(shí)間內(nèi),和/或?qū)儆谀骋坏赜虻鹊臄?shù)據(jù)。需要說(shuō)明的是,通過(guò)用戶(hù)端接收用戶(hù)發(fā)來(lái)的用戶(hù)請(qǐng)求作為查詢(xún)條件只是一個(gè)例子。在步驟102中,查詢(xún)數(shù)據(jù)信息。根據(jù)步驟101中的查詢(xún)條件,查詢(xún)指定數(shù)據(jù)表,獲取與所述指定分組對(duì)應(yīng)的數(shù)據(jù)信息。在本實(shí)施例中,使用find語(yǔ)句查詢(xún)數(shù)據(jù)信息。通過(guò)在find語(yǔ)句中限定查詢(xún)條件,獲取與所述指定分組對(duì)應(yīng)的數(shù)據(jù)信息。例如:查詢(xún)年齡大于20且小于30的用戶(hù)時(shí),可使用:db.users, find({"age":{"$gt":20, "$lte":30}})。在步驟103中,存儲(chǔ)查詢(xún)數(shù)據(jù)。將步驟102中查詢(xún)到的數(shù)據(jù)信息存儲(chǔ)在服務(wù)器上的第一臨時(shí)數(shù)據(jù)緩存表中。該第一臨時(shí)數(shù)據(jù)緩存表可以是預(yù)先建立好的數(shù)據(jù)庫(kù),也可以在存儲(chǔ)數(shù)據(jù)信息時(shí)同步建立。用戶(hù)在存儲(chǔ)所述查詢(xún)的數(shù)據(jù)信息時(shí),可以使用insert語(yǔ)句。
例如:在mtl表中查詢(xún)“name”為“joe”的數(shù)據(jù)信息,存儲(chǔ)于tab2表中。var templ=db.mtl.find(name:"joe");while (temp1.hasNext ()) db.tab2.1nsert (tempi, next ())。在步驟104中,對(duì)第一臨時(shí)數(shù)據(jù)緩存表中的數(shù)據(jù)進(jìn)行分組查詢(xún)計(jì)算。執(zhí)行步驟103之后,MongoDB數(shù)據(jù)庫(kù)中的分片數(shù)據(jù),已經(jīng)存儲(chǔ)于一臺(tái)服務(wù)器上的臨時(shí)數(shù)據(jù)緩存表中,在進(jìn)行所述分組查詢(xún)計(jì)算時(shí),可以使用Group by語(yǔ)句,達(dá)到快速查詢(xún)計(jì)算的效果。在本實(shí)施例的一個(gè)優(yōu)選實(shí)施方式中,在步驟102中,將原查詢(xún)條件拆分為多個(gè)區(qū)間的查詢(xún)條件之和進(jìn)行查詢(xún)。例如:用戶(hù)希望查看2012-1-1至2012-12-31日之間MongoDB下所有分片下廣告投放量的分組匯總結(jié)果??梢詫⒃摬樵?xún)條件拆分為5天為一區(qū)間,對(duì)每一區(qū)間內(nèi)的數(shù)據(jù)依次進(jìn)行查詢(xún)。在步驟102中,可能查詢(xún)出的數(shù)據(jù)量非常大,在步驟103中,將這些數(shù)據(jù)存儲(chǔ)在第一臨時(shí)數(shù)據(jù)表時(shí),可能由于程序的腳本超時(shí)、程序腳本可承擔(dān)的數(shù)據(jù)大小、網(wǎng)絡(luò)延時(shí)、超時(shí)等問(wèn)題會(huì)導(dǎo)致程序、網(wǎng)絡(luò)出現(xiàn)不穩(wěn)定或者錯(cuò)誤。在本實(shí)施例的另一個(gè)優(yōu)選實(shí)施方式中,在步驟103中,在存儲(chǔ)數(shù)據(jù)時(shí),可將大批量的數(shù)據(jù)分成多個(gè)小塊后,分別存儲(chǔ)。例如:將100萬(wàn)條存儲(chǔ)于第一臨時(shí)數(shù)據(jù)庫(kù)時(shí),可分成100個(gè)小塊(每次I萬(wàn)條)進(jìn)行入庫(kù)。需要說(shuō)明的是,對(duì)第一臨時(shí)數(shù)據(jù)庫(kù)的操作,不僅限于存儲(chǔ)數(shù)據(jù)的操作,也可進(jìn)行修改或刪除數(shù)據(jù)的操作,修改或刪除數(shù)據(jù)時(shí)的分塊與存儲(chǔ)數(shù)據(jù)時(shí)的分塊,原理相同。數(shù)據(jù)表、日志表及索引之間的關(guān)系示意圖,請(qǐng)參見(jiàn)圖2。如圖2所示,一張數(shù)據(jù)表200,可以包括一個(gè)或組合索引201及數(shù)據(jù)記錄202。索引201是對(duì)數(shù)據(jù)表200中一列或多列的數(shù)據(jù)記錄進(jìn)行排序的一種結(jié)構(gòu),使用索引201可快速訪問(wèn)數(shù)據(jù)庫(kù)表中的特定數(shù)據(jù)記錄202,提高查找效率。另外,還可以為一張數(shù)據(jù)表200,建立與之對(duì)應(yīng)的日志表210。日志表210用來(lái)記錄數(shù)據(jù)庫(kù)的工作狀態(tài),例如當(dāng)用戶(hù)添加,查找、修改或刪除數(shù)據(jù)庫(kù)對(duì)象的時(shí)候,記錄下來(lái)詳細(xì)的操作步驟及操作時(shí)間。建立日志表210的主要目的是減少數(shù)據(jù)庫(kù)產(chǎn)生臨時(shí)緩存表的數(shù)據(jù)插入或更新的開(kāi)銷(xiāo),以及通過(guò)這些日志表210存儲(chǔ)查詢(xún)條件可以分析冷熱數(shù)據(jù),或者說(shuō)為區(qū)分常用查詢(xún)數(shù)據(jù)、非常用查詢(xún)數(shù)據(jù)。在本實(shí)施例的另一個(gè)優(yōu)選實(shí)施方式中,在步驟103和步驟104之間,增加步驟103-1 (未不出),建立第一臨時(shí)數(shù)據(jù)緩存表的日志表。由于第一臨時(shí)數(shù)據(jù)存儲(chǔ)表中存儲(chǔ)的數(shù)據(jù)量可能相當(dāng)大,通過(guò)第一臨時(shí)數(shù)據(jù)表的日志表可以對(duì)第一臨時(shí)數(shù)據(jù)表中存儲(chǔ)的數(shù)據(jù)進(jìn)行管理。通過(guò)查詢(xún)所述日志表,可以找到第一臨時(shí)數(shù)據(jù)存儲(chǔ)表中查詢(xún)不頻繁的數(shù)據(jù),例如查詢(xún)頻率小于I次/天的數(shù)據(jù)。通過(guò)查詢(xún)所述日志表,可以找到第一臨時(shí)數(shù)據(jù)存儲(chǔ)表中過(guò)時(shí)的信息。例如,已經(jīng)變化的名字或者地址等。
將查找到的上述數(shù)據(jù)從第一臨時(shí)數(shù)據(jù)存儲(chǔ)表中刪除可以釋放部分第一臨時(shí)數(shù)據(jù)存儲(chǔ)表占用的內(nèi)存空間并減少第一臨時(shí)數(shù)據(jù)緩存表中數(shù)據(jù)存儲(chǔ)或更新的開(kāi)銷(xiāo)。在本實(shí)施例的另一個(gè)優(yōu)選實(shí)施方式中,在步驟103-1和步驟104之間,增加步驟103-2 (未示出)。建立第一臨時(shí)數(shù)據(jù)緩存表的一個(gè)或組合索引??筛鶕?jù)經(jīng)驗(yàn)分析、經(jīng)常用到查詢(xún)條件及日志表中經(jīng)常出現(xiàn)的數(shù)據(jù)等因素綜合考慮,創(chuàng)建一個(gè)或組合索引。在本實(shí)施例的另一個(gè)優(yōu)選實(shí)施方式中,在步驟104之后,增加步驟105 (未示出),對(duì)第一臨時(shí)數(shù)據(jù)緩存表中的數(shù)據(jù)進(jìn)行分組查詢(xún)計(jì)算后,將結(jié)果存儲(chǔ)于第二臨時(shí)數(shù)據(jù)緩存表中。在步驟104中,使用Group by語(yǔ)言進(jìn)行分組查詢(xún)和計(jì)算時(shí),返回的數(shù)據(jù)相對(duì)較小,不能超過(guò)I萬(wàn)條,返回超過(guò)該條數(shù)將報(bào)錯(cuò)。為了避免Group by查詢(xún)時(shí)報(bào)錯(cuò),將Group by分組查詢(xún)計(jì)算的結(jié)果存儲(chǔ)在服務(wù)器上的第二臨時(shí)數(shù)據(jù)緩存表中。優(yōu)選的,Group by查詢(xún)時(shí),將原查詢(xún)條件自動(dòng)拆分為多個(gè)區(qū)間的數(shù)據(jù)進(jìn)行查詢(xún)。例如:通過(guò)Group by查詢(xún)后,每次向第二臨時(shí)數(shù)據(jù)緩存表中存儲(chǔ)、修改或刪除的數(shù)據(jù)為I萬(wàn)條。優(yōu)選的,在建立第二臨時(shí)數(shù)據(jù)存儲(chǔ)表之后,建立第二臨時(shí)數(shù)據(jù)表的日志表。通過(guò)查詢(xún)所述日志表,可以找到第二臨時(shí)數(shù)據(jù)存儲(chǔ)表中查詢(xún)不頻繁或過(guò)時(shí)的數(shù)據(jù)。將查找到的上述數(shù)據(jù)從第一臨時(shí)數(shù)據(jù)存儲(chǔ)表中刪除可以釋放部分第一臨時(shí)數(shù)據(jù)存儲(chǔ)表占用的內(nèi)存空間并減少第一臨時(shí)數(shù)據(jù)緩存表中數(shù)據(jù)存儲(chǔ)或更新的開(kāi)銷(xiāo)。優(yōu)選的,在對(duì)第二臨時(shí)數(shù)據(jù)存儲(chǔ)表進(jìn)行的操作或維護(hù)過(guò)程中,可建立第二臨時(shí)數(shù)據(jù)存儲(chǔ)表的一個(gè)或組合索引。本實(shí)施例的技術(shù)方案,通過(guò)對(duì)臨時(shí)緩存表存儲(chǔ)形式的修改,將在多臺(tái)服務(wù)器上存儲(chǔ)的數(shù)據(jù)在一臺(tái)服務(wù)器上集中存儲(chǔ),可以將原來(lái)的MapReduce查詢(xún)替換為Group by查詢(xún),大大提高了數(shù)據(jù)的查詢(xún)和計(jì)算的速度。另外,在本實(shí)施例的優(yōu)選的實(shí)施方式中,通過(guò)增加日志表、索引及分塊操作數(shù)據(jù)庫(kù)的方式,在保證查詢(xún)結(jié)果準(zhǔn)確性的前提下,將Group by查詢(xún)的性能發(fā)揮到最佳。圖3示出了本發(fā)明的第二實(shí)施例。圖3為根據(jù)本發(fā)明第二實(shí)施例的一種MongoDB集群快速查詢(xún)計(jì)算裝置結(jié)構(gòu)示意圖。如圖3所示,為本發(fā)明實(shí)施例所述MongoDB集群快速查詢(xún)裝置結(jié)構(gòu)示意圖。MongoDB集群快速查詢(xún)計(jì)算裝置300包括:確定模塊301、查詢(xún)模塊302、記錄模塊303和處理模塊304。其中:確定模塊301用于確定查詢(xún)條件,所述查詢(xún)條件用于查詢(xún)MongoDB所有分片的指定數(shù)據(jù)表中與指定分組對(duì)應(yīng)的分組匯總信息;查詢(xún)模塊302根據(jù)確定模塊301確定的查詢(xún)條件,查詢(xún)位于MongoDB數(shù)據(jù)庫(kù)集群310中指定數(shù)據(jù)表,獲取所述數(shù)據(jù)表中與所述分組對(duì)應(yīng)的數(shù)據(jù)信息;記錄模塊303,用于將所述數(shù)據(jù)信息存儲(chǔ)在服務(wù)器上的第一臨時(shí)數(shù)據(jù)緩存表中,該服務(wù)器可以是MongoDB集群中的某個(gè)服務(wù)器,也可以是另外設(shè)定的一臺(tái)服務(wù)器;處理模塊304,用于對(duì)所述第一臨時(shí)數(shù)據(jù)緩存表中的數(shù)據(jù)信息進(jìn)行分組查詢(xún)計(jì)算。在本實(shí)施例中,所述查詢(xún)模塊采用find語(yǔ)句查詢(xún)所述指定數(shù)據(jù)表,獲取與所述指定分組對(duì)應(yīng)的數(shù)據(jù)信息。
在本實(shí)施例中,所述處理模塊采用Group by語(yǔ)句對(duì)所述第一臨時(shí)數(shù)據(jù)緩存表中的數(shù)據(jù)信息進(jìn)行分組查詢(xún)計(jì)算。在本實(shí)施例的優(yōu)選實(shí)施方式中,在所述快速查詢(xún)計(jì)算裝置300中包括轉(zhuǎn)存模塊(未示出)用于將所述分組查詢(xún)計(jì)算的結(jié)果存儲(chǔ)在服務(wù)器上第二臨時(shí)數(shù)據(jù)緩存表中。在本實(shí)施例的優(yōu)選實(shí)施方式中,所述查詢(xún)計(jì)算裝置300還包括日志表建立模塊(未不出),用于建立所述第一數(shù)據(jù)緩存表或第二數(shù)據(jù)緩存表的日志表。在本實(shí)施例的優(yōu)選實(shí)施方式中,所述查詢(xún)計(jì)算裝置還包括索引建立模塊(未示出),用于建立所述第一數(shù)據(jù)緩存表或第二數(shù)據(jù)緩存表的一個(gè)或組合索引。本實(shí)施例的查詢(xún)裝置,通過(guò)對(duì)臨時(shí)緩存表存儲(chǔ)形式的修改,將在多臺(tái)服務(wù)器上存儲(chǔ)的數(shù)據(jù)在一臺(tái)服務(wù)器上集中存儲(chǔ),可以將原來(lái)的MapReduce查詢(xún)替換為Group by查詢(xún),大大提高了數(shù)據(jù)的查詢(xún)和計(jì)算的速度。另外,在本實(shí)施例的優(yōu)選的實(shí)施方式中,通過(guò)增加日志表、索引及分塊操作數(shù)據(jù)庫(kù)的方式,在保證查詢(xún)結(jié)果準(zhǔn)確性的前提下,將Group by查詢(xún)的性能發(fā)揮到最佳。注意,上述僅為本發(fā)明的較佳實(shí)施例及所運(yùn)用技術(shù)原理。本領(lǐng)域技術(shù)人員會(huì)理解,本發(fā)明不限于這里所述的特定實(shí)施例,對(duì)本領(lǐng)域技術(shù)人員來(lái)說(shuō)能夠進(jìn)行各種明顯的變化、重新調(diào)整和替代而不會(huì)脫離本發(fā)明的保護(hù)范圍。因此,雖然通過(guò)以上實(shí)施例對(duì)本發(fā)明進(jìn)行了較為詳細(xì)的說(shuō)明,但是本發(fā)明不僅僅限于以上實(shí)施例,在不脫離本發(fā)明構(gòu)思的情況下,還可以包括更多其他等效實(shí)施例,而本發(fā)明的范圍由所附的權(quán)利要求范圍決定。
權(quán)利要求
1.一種MongoDB集群快速查詢(xún)計(jì)算的方法,其特征在于,所述方法包括: 51、確定查詢(xún)條件,所述查詢(xún)條件用于查詢(xún)MongoDB所有分片的指定數(shù)據(jù)表中與查詢(xún)條件對(duì)應(yīng)的指定分組的分組匯總數(shù)據(jù); 52、根據(jù)所述查詢(xún)條件,查詢(xún)所述指定數(shù)據(jù)表,獲取與所述查詢(xún)條件對(duì)應(yīng)的指定分組中的數(shù)據(jù); 53、將所述數(shù)據(jù)存儲(chǔ)在服務(wù)器上的第一臨時(shí)數(shù)據(jù)緩存表中; 54、對(duì)所述第一臨時(shí)數(shù)據(jù)緩存表中的數(shù)據(jù)進(jìn)行分組查詢(xún)并對(duì)查詢(xún)結(jié)果進(jìn)行計(jì)算。
2.根據(jù)權(quán)利要求1所述的快速查詢(xún)計(jì)算方法,其特征在于,在所述步驟S4之后,還包括步驟S5,將步驟S4中所述的分組查詢(xún)計(jì)算的結(jié)果存儲(chǔ)在服務(wù)器上的第二臨時(shí)數(shù)據(jù)緩存表中。
3.根據(jù)權(quán)利要求1或2所述的快速查詢(xún)計(jì)算方法,其特征在于,所述步驟S2中,采用find語(yǔ)句查詢(xún)所述指定數(shù)據(jù)表,獲取與所述查詢(xún)條件對(duì)應(yīng)的指定分組中的數(shù)據(jù),所述步驟S4中,采用Group by語(yǔ)句對(duì)所述第一臨時(shí)數(shù)據(jù)緩存表中的數(shù)據(jù)進(jìn)行分組查詢(xún)并對(duì)查詢(xún)結(jié)果進(jìn)行計(jì)算。
4.根據(jù)權(quán)利要求1或2所述的快速查詢(xún)計(jì)算方法,其特征在于,在所述步驟S3與步驟S4之間,還包括步驟S3-1,建立所述第一數(shù)據(jù)緩存表的日志表。
5.根據(jù)權(quán)利要求1或2所述的快速查詢(xún)計(jì)算方法,其特征在于,在所述步驟S2中,根據(jù)所述查詢(xún)條件,查詢(xún)所述指定數(shù)據(jù)表包括:將所述查詢(xún)條件拆分為多個(gè)區(qū)間的查詢(xún)條件。
6.根據(jù)權(quán)利要求1或2所述的快速查詢(xún)計(jì)算方法,其特征在于,所述步驟S3中,將所述數(shù)據(jù)信息存儲(chǔ)在服務(wù)器的第一臨時(shí)數(shù)據(jù)緩存表中包括:將需要存儲(chǔ)的數(shù)據(jù)分為多個(gè)小塊的數(shù)據(jù)分批存儲(chǔ)。
7.根據(jù)權(quán)利要求2所述的快速查詢(xún)計(jì)算方法,其特征在于,在所述步驟S5之后,還包括步驟S6,建立所述第二臨時(shí)數(shù)據(jù)緩存表的日志表。
8.根據(jù)權(quán)利要求7所述的快速查詢(xún)計(jì)算方法,其特征在于,當(dāng)所述第一臨時(shí)數(shù)據(jù)緩存表的日志表或第二臨時(shí)數(shù)據(jù)緩存表的日志表中的數(shù)據(jù)的查詢(xún)頻率低于預(yù)定頻率閾值時(shí),刪除第一臨時(shí)數(shù)據(jù)緩存表或第二臨時(shí)數(shù)據(jù)緩存表中的所述數(shù)據(jù)。
9.根據(jù)權(quán)利要求8所述的快速查詢(xún)計(jì)算方法,其特征在于,當(dāng)所述第一臨時(shí)數(shù)據(jù)緩存表的日志表或第二臨時(shí)數(shù)據(jù)緩存表的日志表中數(shù)據(jù)的日期屬性超過(guò)過(guò)期時(shí)間閾值時(shí),刪除第一臨時(shí)數(shù)據(jù)緩存表或第二臨時(shí)數(shù)據(jù)緩存表中的對(duì)應(yīng)的數(shù)據(jù)信息。
10.一種MongoDB集群的快速查詢(xún)計(jì)算裝置,其特征在于,所述裝置包含: 確定模塊,用于確定查詢(xún)條件,所述查詢(xún)條件用于查詢(xún)MongoDB所有分片的指定數(shù)據(jù)表中與查詢(xún)條件對(duì)應(yīng)的指定分組的分組匯總數(shù)據(jù); 查詢(xún)模塊,用于根據(jù)所述查詢(xún)條件,查詢(xún)所述指定數(shù)據(jù)表,獲取與所述指定分組對(duì)應(yīng)的數(shù)據(jù)信息; 記錄模塊,用于將所述數(shù)據(jù)信息存儲(chǔ)在服務(wù)器上的第一臨時(shí)數(shù)據(jù)緩存表中; 處理模塊,用于對(duì)所述第一臨時(shí)數(shù)據(jù)緩存表中的數(shù)據(jù)信息進(jìn)行分組查詢(xún)并對(duì)查詢(xún)結(jié)果進(jìn)行計(jì)算。
全文摘要
本發(fā)明公開(kāi)了一種MongoDB集群的快速查詢(xún)計(jì)算的方法及裝置,應(yīng)用于計(jì)算機(jī)、通信及相關(guān)領(lǐng)域。所述方法包括S1、確定查詢(xún)條件,所述查詢(xún)條件用于查詢(xún)MongoDB所有分片的指定數(shù)據(jù)表中與查詢(xún)條件對(duì)應(yīng)的指定分組的分組匯總數(shù)據(jù);S2、根據(jù)所述查詢(xún)條件,查詢(xún)所述指定數(shù)據(jù)表,獲取與所述查詢(xún)條件對(duì)應(yīng)的指定分組中的數(shù)據(jù);S3、將所述數(shù)據(jù)存儲(chǔ)在服務(wù)器上的第一臨時(shí)數(shù)據(jù)緩存表中;S4、對(duì)所述第一臨時(shí)數(shù)據(jù)緩存表中的數(shù)據(jù)進(jìn)行分組查詢(xún)并對(duì)查詢(xún)結(jié)果進(jìn)行計(jì)算。該方法將原來(lái)的分片查詢(xún)方式改進(jìn)為一臺(tái)服務(wù)器上查詢(xún)的方式,在保證查詢(xún)結(jié)果準(zhǔn)確性的前提下,大大提高了查詢(xún)速度。
文檔編號(hào)G06F17/30GK103207919SQ201310150698
公開(kāi)日2013年7月17日 申請(qǐng)日期2013年4月26日 優(yōu)先權(quán)日2013年4月26日
發(fā)明者茹意, 羅峰, 黃蘇支, 李娜 申請(qǐng)人:北京億贊普網(wǎng)絡(luò)技術(shù)有限公司