一種數(shù)據(jù)庫中數(shù)據(jù)存儲的方法及系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機技術(shù)領(lǐng)域,特別涉及一種數(shù)據(jù)庫中數(shù)據(jù)存儲的方法及系統(tǒng)。
【背景技術(shù)】
[0002]隨著計算機技術(shù)以及移動互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,海量存儲系統(tǒng)越來越成為經(jīng)濟社會發(fā)展的需要。這就為計算機系統(tǒng)的設(shè)計難度帶來巨大挑戰(zhàn),例如,單服務(wù)器的網(wǎng)絡(luò)并發(fā)量,以及數(shù)據(jù)查詢量和存儲數(shù)量都得到了前所未有的挑戰(zhàn)。如何在海量的結(jié)構(gòu)化信息中查找到目標數(shù)據(jù),成為業(yè)內(nèi)的一個難題,
[0003]因此,如何對百億,千億的數(shù)據(jù)進行存儲并實現(xiàn)快速查詢,是本領(lǐng)域技術(shù)人員需要解決的技術(shù)問題。
【發(fā)明內(nèi)容】
[0004]本發(fā)明的目的是提供一種數(shù)據(jù)庫中數(shù)據(jù)存儲的方法及系統(tǒng),能夠大大縮小每一列要查詢的數(shù)據(jù)量,不需要進行全表遍歷,可以有效地改進數(shù)據(jù)庫的檢索查詢速度。
[0005]為解決上述技術(shù)問題,本發(fā)明提供一種數(shù)據(jù)庫中數(shù)據(jù)存儲的方法,包括:
[0006]數(shù)據(jù)庫存儲數(shù)據(jù)時,按照每一列數(shù)據(jù)的屬性進行一列的存儲,形成列式存儲,并為每一列數(shù)據(jù)建立一個哈希表;
[0007]在每一列的數(shù)據(jù)中,將每一個字段數(shù)據(jù)都設(shè)置為雙向鏈表的一個節(jié)點,形成一個列雙向鏈表;
[0008]在每一行的數(shù)據(jù)中,將每一個字段數(shù)據(jù)都設(shè)置為雙向鏈表的一個節(jié)點,形成一個行雙向鏈表。
[0009]其中,為每一列數(shù)據(jù)建立一個哈希表包括:
[0010]根據(jù)所述數(shù)據(jù)庫中預(yù)定的列存儲空間,確定哈希表的容量;
[0011]根據(jù)所述容量,為每一列數(shù)據(jù)建立一個哈希表。
[0012]其中,還包括對數(shù)據(jù)庫中的數(shù)據(jù)進行過濾查詢,包括:
[0013]根據(jù)所述哈希表,定位出待查詢數(shù)據(jù)的行首信息,其中,所述行首信息包括行標和行首字段;
[0014]利用所述行首信息及與所述行首信息相對應(yīng)的行雙向鏈表,定位出查詢數(shù)據(jù)。
[0015]其中,根據(jù)所述哈希表,定位出待查詢數(shù)據(jù)的行首信息包括:
[0016]根據(jù)所述哈希表,定位出所述待查詢數(shù)據(jù)的預(yù)定行首信息;
[0017]統(tǒng)計每種預(yù)定行首信息中行標出現(xiàn)的次數(shù);
[0018]判斷所述次數(shù)中是否存在與待查詢數(shù)據(jù)的個數(shù)相同的次數(shù);
[0019]若存在,則確定與待查詢數(shù)據(jù)的個數(shù)相同的次數(shù)對應(yīng)的預(yù)定行首信息作為行首信息。
[0020]其中,還包括:
[0021]接收用戶反饋的所述待查詢數(shù)據(jù)的查詢結(jié)果;
[0022]當(dāng)所述查詢結(jié)果中的錯誤次數(shù)超過閾值,則進行哈希表維護。
[0023]本發(fā)明提供一種數(shù)據(jù)庫中數(shù)據(jù)存儲的系統(tǒng),包括:
[0024]哈希表模塊,用于數(shù)據(jù)庫存儲數(shù)據(jù)時,按照每一列數(shù)據(jù)的屬性進行一列的存儲,形成列式存儲,并為每一列數(shù)據(jù)建立一個哈希表;
[0025]列雙向鏈表模塊,用于在每一列的數(shù)據(jù)中,將每一個字段數(shù)據(jù)都設(shè)置為雙向鏈表的一個節(jié)點,形成一個列雙向鏈表;
[0026]行雙向鏈表模塊,用于在每一行的數(shù)據(jù)中,將每一個字段數(shù)據(jù)都設(shè)置為雙向鏈表的一個節(jié)點,形成一個行雙向鏈表。
[0027]其中,所述哈希表模塊包括:
[0028]容量單元,用于根據(jù)所述數(shù)據(jù)庫中預(yù)定的列存儲空間,確定哈希表的容量;
[0029]建立單元,用于根據(jù)所述容量,為每一列數(shù)據(jù)建立一個哈希表。
[0030]其中,還包括:
[0031]查詢模塊,用于對數(shù)據(jù)庫中的數(shù)據(jù)進行過濾查詢;所述查詢模塊包括:
[0032]定位單元,用于根據(jù)所述哈希表,定位出待查詢數(shù)據(jù)的行首信息,其中,所述行首信息包括行標和行首字段;
[0033]查詢單元,用于利用所述行首信息及與所述行首信息相對應(yīng)的行雙向鏈表,定位出查詢數(shù)據(jù)。
[0034]其中,所述定位單元包括:
[0035]定位子單元,用于根據(jù)所述哈希表,定位出所述待查詢數(shù)據(jù)的預(yù)定行首信息;
[0036]統(tǒng)計子單元,用于統(tǒng)計每種預(yù)定行首信息中行標出現(xiàn)的次數(shù);
[0037]判斷子單元,用于判斷所述次數(shù)中是否存在與待查詢數(shù)據(jù)的個數(shù)相同的次數(shù);
[0038]若存在,則觸發(fā)確定子單元,用于確定與待查詢數(shù)據(jù)的個數(shù)相同的次數(shù)對應(yīng)的預(yù)定行首信息作為行首信息。
[0039]其中,還包括:
[0040]接收模塊,用于接收用戶反饋的所述待查詢數(shù)據(jù)的查詢結(jié)果;
[0041]維護模塊,用于當(dāng)所述查詢結(jié)果中的錯誤次數(shù)超過閾值,則進行哈希表維護。
[0042]本發(fā)明所提供的數(shù)據(jù)庫中數(shù)據(jù)存儲的方法,包括:數(shù)據(jù)庫存儲數(shù)據(jù)時,按照每一列數(shù)據(jù)的屬性進行一列的存儲,形成列式存儲,并為每一列數(shù)據(jù)建立一個哈希表;在每一列的數(shù)據(jù)中,將每一個字段數(shù)據(jù)都設(shè)置為雙向鏈表的一個節(jié)點,形成一個列雙向鏈表;在每一行的數(shù)據(jù)中,將每一個字段數(shù)據(jù)都設(shè)置為雙向鏈表的一個節(jié)點,形成一個行雙向鏈表;
[0043]通過每一列建立的哈希表,可以大大縮小每一列要查詢的數(shù)據(jù)量,不需要進行全表遍歷,提高查詢速度;且在每一行的數(shù)據(jù)中,每一個字段數(shù)據(jù)都是雙向鏈表的一個節(jié)點,由行首的字段可以查詢一行所有的數(shù)據(jù),最終可以有效地改進數(shù)據(jù)庫的檢索查詢速度。
【附圖說明】
[0044]為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)提供的附圖獲得其他的附圖。
[0045]圖1為本發(fā)明實施例所提供的數(shù)據(jù)庫中數(shù)據(jù)存儲的方法的流程圖;
[0046]圖2為本發(fā)明實施例所提供的數(shù)據(jù)庫中數(shù)據(jù)存儲布局的示意圖;
[0047]圖3為本發(fā)明實施例所提供的數(shù)據(jù)庫中數(shù)據(jù)存儲的系統(tǒng)的結(jié)構(gòu)框圖。
【具體實施方式】
[0048]本發(fā)明的核心是提供一種數(shù)據(jù)庫中數(shù)據(jù)存儲的方法及系統(tǒng),能夠大大縮小每一列要查詢的數(shù)據(jù)量,不需要進行全表遍歷,可以有效地改進數(shù)據(jù)庫的檢索查詢速度。
[0049]為使本發(fā)明實施例的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
[0050]請參考圖1,圖1為本發(fā)明實施例所提供的數(shù)據(jù)庫中數(shù)據(jù)存儲的方法的流程圖;該方法可以包括:
[0051]slOO、數(shù)據(jù)庫存儲數(shù)據(jù)時,按照每一列數(shù)據(jù)的屬性進行一列的存儲,形成列式存儲,并為每一列數(shù)據(jù)建立一個哈希表;
[0052]其中,考慮到海量存儲數(shù)據(jù)的特點,在每一行的數(shù)據(jù)中,根據(jù)每一列的屬性,進行一列的存儲,成為列式存儲,每一列形成一個哈希表,當(dāng)上層查詢數(shù)據(jù)的時候,根據(jù)哈希算法,快速定位到一行的行首。
[0053]sllO、在每一列的數(shù)據(jù)中,將每一個字段數(shù)據(jù)都設(shè)置為雙向鏈表的一個節(jié)點,形成一個列雙向鏈表;
[0054]sl20、在每一行的數(shù)據(jù)中,將每一個字段數(shù)據(jù)都設(shè)置為雙向鏈表的一個節(jié)點,形成一個行雙向鏈表。
[0055]其中,在每一行的數(shù)據(jù)中,每一個字段數(shù)據(jù)都是雙向鏈表的一個節(jié)點,由行首的字段可以查詢了一行所有的數(shù)據(jù)。
[0056]其中,要想在查詢數(shù)據(jù)時提高查詢速度,必須要對數(shù)據(jù)在文件中的存儲形式和數(shù)據(jù)的索引形式進行改變,例如,關(guān)系型數(shù)據(jù)的列式存儲,可以將每一列的值直接排列下來,不用引入其他的概念,也不會丟失數(shù)據(jù)。關(guān)系型數(shù)據(jù)的列式存儲比較好理解;嵌套類型數(shù)據(jù)的一行叫做一個記錄(record),嵌套數(shù)據(jù)類型的特點是一個record中的列向量(column)除了可以是整形Int,長整形Long,字符串String這樣的原語(primitive)類型以外,還可以是表List,映射Map,集合Set這樣的復(fù)雜類型。
[0057]根據(jù)本實施例提供的數(shù)據(jù)庫中數(shù)據(jù)存儲的方法,請參考圖2為按照上述方法得到的數(shù)據(jù)庫中數(shù)據(jù)存儲布局的示意圖。
[0058]基于上述技術(shù)方案,本發(fā)明實施例提供的數(shù)據(jù)庫中數(shù)據(jù)存儲的方法,能夠通過每一列建立的哈希表,可以大大縮小每一列要查詢的數(shù)據(jù)量,不需要進行全表遍歷,提高查詢速度;且在每一行的數(shù)據(jù)中,每一個字段數(shù)據(jù)都是雙向鏈表的一個節(jié)點,由行首的字段可以查詢一行所有的數(shù)據(jù),最終可以有效地改進數(shù)據(jù)庫的檢索查詢速度。
[0059]基于上述實施例,還包括對數(shù)據(jù)庫中的數(shù)據(jù)進行過濾查詢,可以包括:
[0060]根據(jù)所述哈希表,定位出待查詢數(shù)據(jù)的行首信息,其中,所述行首信息包括行標和行首字段;
[0061]其中,即確定待查詢數(shù)據(jù)的在哪一行,然后給定行首信息,即可以是第一行,或者是001,或者其他可以表示行首的字符等。
[0062]利用所述行首信息及與所述行首信息相對應(yīng)的行雙向鏈表,定位出查詢數(shù)據(jù)。
[0063]其中,由于在每一行的數(shù)據(jù)中,每一個字段數(shù)據(jù)都是雙向鏈表的一個節(jié)點,由行首的字段可以查詢了一行所有的數(shù)據(jù)。因此,這里確定了行首信息,就可以根據(jù)行雙向鏈表,查詢到待查詢數(shù)據(jù)。
[0064]可選的,根據(jù)所述哈希表,定位出待查詢數(shù)據(jù)的行首信息可以包括:
[0065]根據(jù)所述哈希表,定位出所述待查詢數(shù)據(jù)的預(yù)定行首信息;
[0066]統(tǒng)計每種預(yù)定行首信息中行標出現(xiàn)的次數(shù);
[0067]判斷所述次數(shù)中是否存在與待查詢數(shù)據(jù)的個數(shù)相同的次數(shù);
[0068]若存在,則確定與待查詢數(shù)據(jù)的個數(shù)相同的次數(shù)對應(yīng)的預(yù)定行首信息作為行首信息。
[0069]其中,每一列進行哈希查找,然后再根據(jù)查找的結(jié)果中的標記位,進行匹配,如果匹配成功則表示在同一行的,就是要查找的數(shù)據(jù)。整個匹配的過程就是要確定需要查詢的數(shù)據(jù)是否在同一行,例如查詢李明的各科考試成績,那么則必須保證所有查詢到的數(shù)據(jù)都要在李明這一行,才是李明的成績,否則是別人的成績,因此,需要進行匹配。即查詢李明的三科成績,則會查詢四列名字屬性那一列查詢李明,一科成績一列查詢李明該科成績,若李明在第5行,則需要看5的行標出現(xiàn)的次數(shù)是否為4次,若是,則第5行的行首信息即為需要的行首信息。其他出現(xiàn)不足4次的都不匹配。
[0070]請參考圖2,進行舉例說明,查詢