專利名稱:一種鍵值數(shù)據(jù)庫的多鍵查找實現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機技術(shù)領(lǐng)域,特別涉及一種鍵值數(shù)據(jù)庫的多鍵查找實現(xiàn)方法。
背景技術(shù):
經(jīng)過幾十年的發(fā)展,關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)被廣泛應用,但是同時暴露出很多先天缺陷,其性能無法適應最新的很多類型的應用需求。NoSQL是近年來發(fā)展壯大的新的數(shù)據(jù)存儲管理技術(shù),它試圖避免RDBMS在超大數(shù)據(jù)量和大量多表連接的情況下性能低下的缺點。鍵值存儲引擎(key/value storage engine)是NoSQL的一種技術(shù)方案,它存儲無模式的鍵值數(shù)據(jù)(key/value pair),鍵值數(shù)據(jù)在存儲引擎內(nèi)部都是無結(jié)構(gòu)的字節(jié)串,存儲引擎內(nèi)部不理解鍵值數(shù)據(jù)的內(nèi)部結(jié)構(gòu),而由應用程序負責解析和處理鍵值數(shù)據(jù)。鍵值存儲引
擎需要支持完整的ACID事務語義和高效的鍵值數(shù)據(jù)的存儲和訪問方法,并且通過用戶注冊的回調(diào)函數(shù)理解鍵值數(shù)據(jù)的內(nèi)部結(jié)構(gòu)并且操作鍵值數(shù)據(jù)?!愕膋ey-value數(shù)據(jù)庫只能進行單鍵值的查找,例如可以查找key=某個值的value,而不能查找key (I) =某個值并且key (2)=某個值…并且key (η) =某個值的value。個別的key-value數(shù)據(jù)庫實現(xiàn)了多鍵的查找功能,例如,berkeleyDB實現(xiàn)了多鍵值的查找,其通過secondary database (可以理解為主數(shù)據(jù)表的索引)實現(xiàn)的多鍵查找。berkeleyDB單鍵查找是直接通過key的值訪問primary database(可以理解為主數(shù)據(jù)表)來得到value的。參閱圖I。圖I示出了一種現(xiàn)有技術(shù)中的多鍵查找技術(shù)方案。例如,若primarydatabase中存儲了用戶的信息,key為用戶id, value為用戶的詳細信息,假設(shè)為“名字年齡住址”組成的字符串。那么現(xiàn)在可以通過用戶的ID在primary database中得到用戶的詳細信息。若現(xiàn)在的需求是查詢所有住址為北京,年齡為20歲的用戶,這就需要進行多鍵查找,也即需要設(shè)置key (1)=20并且key (2)=“北京”。那么就需要在primary database上建立 secondary database,在 secondary database 中,key 就是年齡和住址,value 則為用戶ID。上述的多鍵查找的實現(xiàn)實際上是通過先訪問secondary database得到用戶ID,再通過訪問primary database通過用戶的ID來實現(xiàn)的。由此,本技術(shù)領(lǐng)域的技術(shù)人員可以理解的是上述的解決方案總共進行了兩次的數(shù)據(jù)訪問,由此帶來的缺陷是導致了較多的10開銷,因此,這種多鍵查找的實現(xiàn)方案具有性能低下的缺陷。
發(fā)明內(nèi)容
為解決上述問題,本發(fā)明技術(shù)方案提供了一種鍵值數(shù)據(jù)庫的多鍵查找實現(xiàn)方法,包括為所述鍵值數(shù)據(jù)庫中的主數(shù)據(jù)表注冊第一鍵的劃分結(jié)構(gòu),并為所述主數(shù)據(jù)表索引表注冊第二鍵的劃分結(jié)構(gòu),所述主數(shù)據(jù)表和索引表的第一鍵的劃分結(jié)構(gòu)和所述第二鍵的劃分結(jié)構(gòu)分別設(shè)置所述主數(shù)據(jù)表和所述索引表的每一行數(shù)據(jù)的劃分方法和每一列數(shù)據(jù)的比較函數(shù),從而為所述主數(shù)據(jù)表創(chuàng)建索引時創(chuàng)建出滿足多列查找的索引表;
通過所述比較函數(shù)以構(gòu)建出節(jié)點間存在多列大小關(guān)系的樹;通過所述樹的根節(jié)點查找存有滿足查詢條件的記錄指針的第一個葉節(jié)點;以所述第一個葉節(jié)點作為起點經(jīng)過一次遍歷找到同時滿足查詢條件的所有節(jié)占.其中,每個節(jié)點的查詢步驟為如果前一列的比較結(jié)果滿足查找條 件,則使用下一列的比較函數(shù),直至判斷出該節(jié)點是否滿足多列查詢條件??蛇x地,所述的第一鍵的劃分結(jié)構(gòu)為包columnlnfo結(jié)構(gòu),所述columnlnfo結(jié)構(gòu)包括以下的參數(shù)Keys :數(shù)值型,其表示所述主數(shù)據(jù)表的一行數(shù)據(jù)劃分的列的數(shù)目;col_number :空;rd_comfunction:函數(shù)的數(shù)組,存放了每個列的比較函數(shù);spIit_function:行的切分函數(shù),傳入行數(shù)據(jù)和列號,返回該列的起始地址和列的長度可選地,所述的第二鍵的劃分結(jié)構(gòu)為columnlnfo結(jié)構(gòu),所述columnlnfo結(jié)構(gòu)包括以下的參數(shù)Keys :數(shù)值型,其表示所述索引表的一行數(shù)據(jù)劃分的列的數(shù)目;col_number :數(shù)值的數(shù)組,表達了所述索引鍵和所述主數(shù)據(jù)表的列的對應關(guān)系;rd_comfunction:函數(shù)的數(shù)組,存放了每個列的比較函數(shù);sp I i t_f unct ion:行的切分函數(shù),傳入行數(shù)據(jù)和列號,返回該列的起始地址和列的長度??蛇x地,所述的為所述鍵值數(shù)據(jù)庫中的主數(shù)據(jù)表和索引表注冊鍵的劃分結(jié)構(gòu)具體為在創(chuàng)建表和索引的函數(shù)中增加columnlnfo類型的參數(shù),并且在創(chuàng)建主數(shù)據(jù)表和索引時導入將所述columnlnfo結(jié)構(gòu)體??蛇x地,所述的鍵值數(shù)據(jù)庫為NoSQL數(shù)據(jù)庫。可選地,所述的索引表為一 B樹。與現(xiàn)有技術(shù)相比,上述技術(shù)方案具有下優(yōu)點本發(fā)明的技術(shù)方案可以有效、合理地提高多鍵值查找的效率,其所采用的技術(shù)方案簡單、高效,開銷可以忽略不計,有效節(jié)約了資源,并且采用本發(fā)明的技術(shù)方案提供的這種方法實現(xiàn)的多鍵值查找,只進行一次索引的查詢就可以得到所有符合查詢條件的條目,使用方便、高效。
圖I是現(xiàn)有技術(shù)中的一種鍵值數(shù)據(jù)庫實現(xiàn)多鍵查找方法的示意圖;圖2是本發(fā)明實施方式的鍵值數(shù)據(jù)庫的多鍵查找實現(xiàn)方法的流程圖。
具體實施例方式為使本發(fā)明的上述目的、特征和優(yōu)點能夠更為明顯易懂,下面結(jié)合附圖對本發(fā)明的具體實施方式
做詳細的說明。在以下描述中闡述了具體細節(jié)以便于充分理解本發(fā)明。但是本發(fā)明能夠以多種不同于在此描述的其它方式來實施,本領(lǐng)域技術(shù)人員可以在不違背本發(fā)明內(nèi)涵的情況下做類似推廣。因此本發(fā)明不受下面公開的具體實施方式
的限制。本技術(shù)領(lǐng)域的技術(shù)人員知道,一般的key-value數(shù)據(jù)庫只能進行單鍵值的查找,例如可以查找key=某個值的value,而不能查找key (I) =某個值并且key (2) =某個值…并且key (η) =某個值的value。個別的key-value數(shù)據(jù)庫實現(xiàn)了多鍵的查找功能,例如,berkeleyDB實現(xiàn)了多鍵值的查找,其通過secondarydatabase (可以理解為主數(shù)據(jù)表的索弓I)實現(xiàn)的多鍵查找。berkeleyDB單鍵查找是直接通過key的值訪問primary database(可以理解為主數(shù)據(jù)表)來得到value的。參閱圖I。圖I示出了一種現(xiàn)有技術(shù)中的多鍵查找技術(shù)方案。例如,若primary database中存儲了用戶的信息,key為用戶id, value為用戶的詳細信息,假設(shè)為“名字年齡住址”組成的字符串。那么現(xiàn)在可以通過用戶的ID在primarydatabase中得到用戶的詳細信息。若現(xiàn)在的需求是查詢所有住址為北京,年齡為20歲的用戶,這就需要進行多鍵查找,也即需要設(shè)置key(l)=20并且key(2)= “北京”。那么就需要在 primary database 上建立 secondary database,在 secondary database 中,key 就是年齡和住址,value則為用戶ID。上述的多鍵查找的實現(xiàn)實際上是通過先訪問secondarydatabase得到用戶ID,再通過訪問primary database通過用戶的ID來實現(xiàn)的。由此,本 技術(shù)領(lǐng)域的技術(shù)人員可以理解的是上述的解決方案總共進行了兩次的數(shù)據(jù)訪問,由此帶來的缺陷是導致了較多的IO開銷,因此,這種多鍵查找的實現(xiàn)方案具有性能低下的缺陷。為解決現(xiàn)有技術(shù)中的問題,本發(fā)明的發(fā)明人經(jīng)過研究,提出了一種本發(fā)明實施方式的鍵值數(shù)據(jù)庫的多鍵查找實現(xiàn)方法。參閱圖2,圖2示出了本發(fā)明實施方式的鍵值數(shù)據(jù)庫的多鍵查找方法。如圖2所示,本發(fā)明實施方式鍵值數(shù)據(jù)庫的多鍵查找實現(xiàn)方法,包括步驟SlO :為所述鍵值數(shù)據(jù)庫中的主數(shù)據(jù)表注冊第一鍵的劃分結(jié)構(gòu),并為所述主數(shù)據(jù)表索引表注冊第二鍵的劃分結(jié)構(gòu),所述主數(shù)據(jù)表和索引表的第一鍵的劃分結(jié)構(gòu)和所述第二鍵的劃分結(jié)構(gòu)分別設(shè)置所述主數(shù)據(jù)表和所述索引表的每一行數(shù)據(jù)的劃分方法和每一列數(shù)據(jù)的比較函數(shù),從而為所述主數(shù)據(jù)表創(chuàng)建索引時創(chuàng)建出滿足多列查找的索引表;步驟S20 :通過所述比較函數(shù)以構(gòu)建出節(jié)點間存在多列大小關(guān)系的樹;步驟S30 :通過所述樹的根節(jié)點查找存有滿足查詢條件的記錄指針的第一個葉節(jié)占.步驟S40 :以所述第一個葉節(jié)點作為起點經(jīng)過一次遍歷找到同時滿足查詢條件的所有節(jié)點;其中,每個節(jié)點的查詢步驟為如果前一列的比較結(jié)果滿足查找條件,則使用下一列的比較函數(shù),直至判斷出該節(jié)點是否滿足多列查詢條件。其中,所述的第一鍵的劃分結(jié)構(gòu)為columnlnfo結(jié)構(gòu),所述columnlnfo結(jié)構(gòu)包括以下的參數(shù)Keys :數(shù)值型,其表示所述主數(shù)據(jù)表的一行數(shù)據(jù)劃分的列的數(shù)目;col_number :空(主數(shù)據(jù)表不用);rd_comfunction:函數(shù)的數(shù)組,存放了每個列的比較函數(shù);spIit_function:行的切分函數(shù),傳入行數(shù)據(jù)和列號,返回該列的起始地址和列的長度。所述的第二鍵的劃分結(jié)構(gòu)為columnlnfo結(jié)構(gòu),所述columnlnfo結(jié)構(gòu)包括以下的
參數(shù)
Keys :數(shù)值型,其表示所述索引表的一行數(shù)據(jù)劃分的列的數(shù)目;col_number :數(shù)值的數(shù)組,表達了索引鍵和主數(shù)據(jù)表的列的對應關(guān)系;rd_comfunction:函數(shù)的數(shù)組,存放了每個列的比較函數(shù);sp I i t_f unct ion:行的切分函數(shù),傳入行數(shù)據(jù)和列號,返回該列的起始地址和列的長度。其中,所述鍵值數(shù)據(jù)庫中的主數(shù)據(jù)表和索引表注冊第一鍵的劃分結(jié)構(gòu)和第二鍵的劃分結(jié)構(gòu)方式為在創(chuàng)建表和索引的函數(shù)中增加columnlnfo類型的參數(shù),并并且在創(chuàng)建主數(shù)據(jù)表和索引時導入所述columnlnfo結(jié)構(gòu)體。另外,本發(fā)明實施方式中的鍵值數(shù)據(jù)庫優(yōu)選為NoSQL數(shù)據(jù)庫?!け炯夹g(shù)領(lǐng)域人員知道的是,創(chuàng)建索引需要排序,而排序的實現(xiàn)則需要該種數(shù)據(jù)類型的比較函數(shù),從而構(gòu)建出節(jié)點間存在大小關(guān)系的樹。索引的查找就是通過在這棵樹上遍歷來實現(xiàn)的。支持多列查找的索引排序使用的比較函數(shù)是所有列的比較函數(shù),排序時按照次序如果前一列的比較結(jié)果相等那么繼續(xù)使用下一列的比較函數(shù),直到得出比較結(jié)果。例如,三個數(shù)據(jù)條目=2308:09 ;1212:12 ;1220:40 ;我們的列劃分的規(guī)則是前兩個字節(jié)為第一列,剩下的字節(jié)為一列,那么我們規(guī)定第一列為整數(shù),第二列為時間,整數(shù)和時間有著不同的比較函數(shù)。那么按照上邊的排序原則從小到大的排序結(jié)果應該為1212:12 ; 1220:40 ;2308:09。實現(xiàn)了多列的排序,從而實現(xiàn)了多列索引的構(gòu)建,從而實現(xiàn)了多列數(shù)據(jù)的查找。如上述的例子,若數(shù)據(jù)表中存儲了用戶的信息,現(xiàn)在數(shù)據(jù)庫中為每一個用戶存儲一行字節(jié)串,所存儲的字節(jié)串的內(nèi)容為“ ID名字年齡住址”,數(shù)據(jù)連續(xù)存儲。在為主數(shù)據(jù)表和索引表注冊鍵值數(shù)據(jù)庫目前并不理解“ID名字年齡住址”是要被分為4個列的?,F(xiàn)在我們要為主數(shù)據(jù)表注冊一個columnlnfo結(jié)構(gòu),columnlnfo結(jié)構(gòu)表達“主數(shù)據(jù)表的每一行數(shù)據(jù)怎樣劃分,每一列數(shù)據(jù)的比較規(guī)則是什么”。所述的columnlnfo結(jié)構(gòu)的內(nèi)
容如下
成W名稱成
keys4 (共分I P, % :f . -5:齡》往i.:丨4 5'j )
col number空(主敎據(jù)表:/、用)
rd cunifunctian S令比較扃教,按次序泠:致值比較為ft.字仔忠比較 函敦,數(shù)圮比較字圩島比較函敦
^ P· I i I i'anci ion 行的切分A. ft: 貨K I、2, 3.七分.?+丨能.;€'沿正碎的1Π.名字,I齡.住址折&的起始地址和長度為了滿足查詢所有住址為北京,年齡為20歲的用戶的需求,我們需要對查詢鍵住址,年齡兩個列創(chuàng)建索引,需要給該索引注冊類似的columnlnfo結(jié)構(gòu)
權(quán)利要求
1.一種鍵值數(shù)據(jù)庫的多鍵查找實現(xiàn)方法,其特征在于,包括 為所述鍵值數(shù)據(jù)庫中的主數(shù)據(jù)表注冊第一鍵的劃分結(jié)構(gòu),并為所述主數(shù)據(jù)表索引表注冊第二鍵的劃分結(jié)構(gòu),所述主數(shù)據(jù)表和索引表的第一鍵的劃分結(jié)構(gòu)和所述第二鍵的劃分結(jié)構(gòu)分別設(shè)置所述主數(shù)據(jù)表和所述索引表的每一行數(shù)據(jù)的劃分方法和每一列數(shù)據(jù)的比較函數(shù),從而為所述主數(shù)據(jù)表創(chuàng)建索引時創(chuàng)建出滿足多列查找的索引表; 通過所述比較函數(shù)以構(gòu)建出節(jié)點間存在多列大小關(guān)系的樹; 通過所述樹的根節(jié)點查找存有滿足查詢條件的記錄指針的第一個葉節(jié)點; 以所述第一個葉節(jié)點作為起點經(jīng)過一次遍歷找到同時滿足查詢條件的所有節(jié)點; 其中,每個節(jié)點的查詢步驟為如果前一列的比較結(jié)果滿足查找條件,則使用下一列的比較函數(shù),直至判斷出該節(jié)點是否滿足多列查詢條件。
2.如權(quán)利要求I所述鍵值數(shù)據(jù)庫的多鍵查找實現(xiàn)方法,其特征在于, 所述的第一鍵的劃分結(jié)構(gòu)為columnlnfo結(jié)構(gòu),所述columnlnfo結(jié)構(gòu)包括以下的參數(shù) Keys :數(shù)值型,其表示所述主數(shù)據(jù)表的一行數(shù)據(jù)劃分的列的數(shù)目; col_number :空; rd_comfunction:函數(shù)的數(shù)組,存放了每個列的比較函數(shù); split_function:行的切分函數(shù),傳入行數(shù)據(jù)和列號,返回該列的起始地址和列的長度。
3.如權(quán)利要求I所述的鍵值數(shù)據(jù)庫的多鍵查找實現(xiàn)方法,其特征在于,所述的第二鍵的劃分結(jié)構(gòu)為columnlnfo結(jié)構(gòu),所述columnlnfo結(jié)構(gòu)包括以下的參數(shù) Keys :數(shù)值型,其表示所述索引表的一行數(shù)據(jù)劃分的列的數(shù)目; col_number :數(shù)值的數(shù)組,表達了所述索引鍵和所述主數(shù)據(jù)表的列的對應關(guān)系; rd_comfunction:函數(shù)的數(shù)組,存放了每個列的比較函數(shù); split_function:行的切分函數(shù),傳入行數(shù)據(jù)和列號,返回該列的起始地址和列的長度。
4.如權(quán)利要求2或3所述的鍵值數(shù)據(jù)庫的多鍵查找實現(xiàn)方法,其特征在于,所述的為所述鍵值數(shù)據(jù)庫中的主數(shù)據(jù)表和索引表注冊鍵的劃分結(jié)構(gòu)具體為在創(chuàng)建表和索引的函數(shù)中增加columnlnfo類型的參數(shù),并且在創(chuàng)建主數(shù)據(jù)表和索引時導入將所述columnlnfo結(jié)構(gòu)體。
5.如權(quán)利要求I所述的鍵值數(shù)據(jù)庫的多鍵查找實現(xiàn)方法,其特征在于,所述的鍵值數(shù)據(jù)庫為NoSQL數(shù)據(jù)庫。
6.如權(quán)利要求I所述的鍵值數(shù)據(jù)庫的多鍵查找實現(xiàn)方法,其特征在于,所述的索引表為一 B樹。
全文摘要
本發(fā)明提供了一種鍵值數(shù)據(jù)庫的多鍵查找實現(xiàn)方法,包括為所述鍵值數(shù)據(jù)庫中的主數(shù)據(jù)表注冊第一鍵的劃分結(jié)構(gòu)并為所述主數(shù)據(jù)表索引表注冊第二鍵的劃分結(jié)構(gòu),所述的主數(shù)據(jù)表和索引表的第一鍵的劃分結(jié)構(gòu)和所述第二鍵的劃分結(jié)構(gòu)分別規(guī)定了所述主數(shù)據(jù)表和所述索引表的每一行數(shù)據(jù)的劃分方法和每一列數(shù)據(jù)的比較規(guī)則,從而為所述主數(shù)據(jù)表創(chuàng)建索引時創(chuàng)建出滿足多列查找的索引表。本發(fā)明的技術(shù)方案可以有效、合理地提高多鍵值查找的效率,其所采用的技術(shù)方案簡單、高效,開銷可以忽略不計,有效節(jié)約了資源,并且采用本發(fā)明的技術(shù)方案提供的這種方法實現(xiàn)的多鍵值查找,只進行一次索引的查詢就可以得到所有符合查詢條件的條目,使用方便、高效。
文檔編號G06F17/30GK102955843SQ20121035275
公開日2013年3月6日 申請日期2012年9月20日 優(yōu)先權(quán)日2012年9月20日
發(fā)明者鄭程光, 趙偉, 賴錚, 孫偉豐, 李泉, 李 浩, 李書淦, 程仁波 申請人:北大方正集團有限公司, 上海方正數(shù)字出版技術(shù)有限公司