分表分頁排序查詢方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于數(shù)據(jù)查詢技術(shù)領(lǐng)域,尤其涉及一種分表分頁排序查詢方法及裝置。
【背景技術(shù)】
[0002]目前分表分頁最好的解決技術(shù)是計算得出符合查詢條件的N張表并分別查詢每張表中滿足條件的記錄數(shù),之后,根據(jù)請求頁和請求頁的記錄數(shù),定位到請求頁所在的表和該表中記錄所處的位置,再根據(jù)表和記錄所處的位置查詢數(shù)據(jù)庫獲取相應(yīng)的記錄,最后返回結(jié)果至應(yīng)用層,在數(shù)據(jù)訪問層訪問數(shù)據(jù)庫之前與處理完結(jié)果后都訪問緩存區(qū)域,讀取或保存相應(yīng)數(shù)據(jù),通過分層分頁查詢,提高了數(shù)據(jù)庫資源的有效利用,緩解了數(shù)據(jù)庫系統(tǒng)的壓力。但上述解決技術(shù)有一個問題,其每次查詢都要查所有的分表記錄數(shù)據(jù),不能對所有的分表進行排序,并按排序后的結(jié)果進行分頁處理,且不能對多個分聯(lián)進行聯(lián)合查詢。
【發(fā)明內(nèi)容】
[0003]本發(fā)明實施例的目的在于提供一種分表分頁排序查詢方法及裝置,旨在解決現(xiàn)有技術(shù)無法對數(shù)據(jù)的查詢結(jié)果集進行排序顯示的問題。
[0004]本發(fā)明實施例是這樣實現(xiàn)的,一種分表分頁排序查詢方法,所述方法包括如下步驟:
[0005]通過預(yù)設(shè)的查詢參數(shù)和分表規(guī)則計算得到分表二維數(shù)組;所述分表二維數(shù)組的一維數(shù)組為同一查詢參數(shù)值對應(yīng)的多個分表;
[0006]根據(jù)預(yù)設(shè)的數(shù)據(jù)結(jié)構(gòu)和所述查詢參數(shù)為所述分表二級數(shù)組建立本次查詢的查詢結(jié)果集的索引表;所述數(shù)據(jù)結(jié)構(gòu)包括查詢參數(shù)、所述查詢參數(shù)對應(yīng)的一維數(shù)組內(nèi)每一分表的序號和行數(shù);
[0007]當(dāng)需要調(diào)取所述索引表內(nèi)待查詢頁的數(shù)據(jù)時,根據(jù)所述索引表定位該待查詢頁的數(shù)據(jù)所在的一組或多組分表;
[0008]調(diào)取所述一組或多組分表的數(shù)據(jù),并顯示。
[0009]進一步地,所述根據(jù)預(yù)設(shè)的數(shù)據(jù)結(jié)構(gòu)和查詢參數(shù)為分表二級數(shù)組建立本次查詢的查詢結(jié)果集的索引表包括:
[0010]遍歷分表二維數(shù)組,取每一一維數(shù)組;
[0011]創(chuàng)建HashMap,將每一查詢參數(shù)值作為HashMap的Key,將所述一維數(shù)組中每一查詢參數(shù)值對應(yīng)的數(shù)據(jù)作為HashMap的Value,得到索引表。
[0012]進一步地,所述HashMap的Value為一二維數(shù)組,第一行數(shù)據(jù)為同一查詢參數(shù)值對應(yīng)的數(shù)據(jù)在每一分表中的行數(shù),第二行數(shù)據(jù)為該分表在分表二維數(shù)組中的下標值。
[0013]進一步地,所述當(dāng)需要調(diào)取索引表內(nèi)待查詢頁的數(shù)據(jù)時,根據(jù)索引表定位該查詢頁的數(shù)據(jù)所在的一組或多組分表包括:
[0014]根據(jù)所述待查詢頁的序號和行數(shù),計算所述待查詢頁的數(shù)據(jù)所在分表在所述索引表的位置;
[0015]根據(jù)所述待查詢頁的數(shù)據(jù)所在分表在所述索引表的位置,獲取索引表中待查詢頁的數(shù)據(jù)所在分表的下標值和所述數(shù)據(jù)在該分表內(nèi)的行數(shù)。
[0016]本發(fā)明還提出一種分表分布排序查詢的裝置,所述裝置包括:
[0017]計算模塊,用于通過預(yù)設(shè)的查詢參數(shù)和分表規(guī)則計算得到分表二維數(shù)組;所述分表二維數(shù)組的一維數(shù)組為同一查詢參數(shù)值對應(yīng)的多個分表;
[0018]建立索引模塊,用于根據(jù)預(yù)設(shè)的數(shù)據(jù)結(jié)構(gòu)和所述查詢參數(shù)為所述分表二級數(shù)組建立本次查詢的查詢結(jié)果集的索引表;所述數(shù)據(jù)結(jié)構(gòu)包括查詢參數(shù)、所述查詢參數(shù)對應(yīng)的一維數(shù)組內(nèi)每一分表的序號和行數(shù);
[0019]定位模塊,用于當(dāng)需要調(diào)取所述索引表內(nèi)待查詢頁的數(shù)據(jù)時,根據(jù)所述索引表定位該待查詢頁的數(shù)據(jù)所在的一組或多組分表;
[0020]顯示模塊,用于調(diào)取所述一組或多組分表的數(shù)據(jù),并顯示。
[0021]進一步地,所述建立索引模塊包括:
[0022]取數(shù)單元,用于遍歷分表二維數(shù)組,取每一一維數(shù)組;
[0023]創(chuàng)建HashMap單元,用于創(chuàng)建HashMap,將每一查詢參數(shù)值作為HashMap的Key,將所述一維數(shù)組中每一查詢參數(shù)值對應(yīng)的數(shù)據(jù)作為HashMap的Value,得到索引表。
[0024]進一步地,所述HashMap的Value為一二維數(shù)組,第一行數(shù)據(jù)為同一查詢參數(shù)值對應(yīng)的數(shù)據(jù)在每一分表中的行數(shù),第二行數(shù)據(jù)為該分表在分表二維數(shù)組中的下標值。
[0025]進一步地,所述定位模塊包括:
[0026]計算單元,用于根據(jù)所述待查詢頁的序號和行數(shù),計算所述待查詢頁的數(shù)據(jù)所在分表在所述索引表的位置;
[0027]獲取單元,用于根據(jù)所述待查詢頁的數(shù)據(jù)所在分表在所述索引表的位置,獲取索引表中待查詢頁的數(shù)據(jù)所在分表的下標值和所述數(shù)據(jù)在該分表內(nèi)的行數(shù)。
[0028]本發(fā)明實施例可對查詢結(jié)果集進行排序顯示,解決了任何一種分表、排序、分頁查詢的問題,作為排序列可以是任何的查詢參數(shù),不受限制,分表的規(guī)則也不受限制,因此采用排序索引查詢結(jié)果集定位每一組分表分頁數(shù)據(jù),速度快,索引數(shù)據(jù)結(jié)構(gòu)精簡,占用內(nèi)存少,通過緩存保存索引數(shù)據(jù),大大減少了數(shù)據(jù)庫的查詢。本發(fā)明實施例可以封裝在一起,能用一行代碼處理完所有的功能。
【附圖說明】
[0029]圖1是本發(fā)明實施例一提供的分表分頁排序查詢方法的流程圖;
[0030]圖2是本發(fā)明實施例一提供的分表分頁排序查詢方法中索引表的示意圖;
[0031]圖3是本發(fā)明實施例二提供的分表分頁排序查詢裝置的結(jié)構(gòu)圖;
[0032]圖4是本發(fā)明實施例二提供的分表分頁排序查詢裝置中建立索引模塊的結(jié)構(gòu)圖;
[0033]圖5是本發(fā)明實施例二提供的分表分頁排序查詢裝置中定位模塊的結(jié)構(gòu)圖。
【具體實施方式】
[0034]為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進行進一步詳細說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
[0035]實施例一
[0036]本發(fā)明實施例一提供一種分表分頁排序查詢方法,如圖1所示,本發(fā)明實施例一的方法包括步驟:
[0037]S1、通過預(yù)設(shè)的查詢參數(shù)和分表規(guī)則計算得到分表二維數(shù)組;分表二維數(shù)組的一維數(shù)組為同一查詢參數(shù)值對應(yīng)的多個分表。
[0038]上述預(yù)設(shè)的查詢參數(shù)可以根據(jù)需要進行設(shè)置,在實際應(yīng)用中可能是餐飲類的價格、菜品等。通過查詢參數(shù)和分表規(guī)則計算出所有的多組分表,分別存放于二維數(shù)組中,本發(fā)明實施例一將該二維數(shù)組稱為分表二維數(shù)組,分表二維數(shù)組的一維數(shù)據(jù)存儲同一次查詢所關(guān)聯(lián)的分表。
[0039]S2、根據(jù)預(yù)設(shè)的數(shù)據(jù)結(jié)構(gòu)和查詢參數(shù)為分表二級數(shù)組建立本次查詢的查詢結(jié)果集的索引表;數(shù)據(jù)結(jié)構(gòu)包括查詢參數(shù)、所述查詢參數(shù)對應(yīng)的一維數(shù)組內(nèi)每一分表的序號和行數(shù)。
[0040]具體地,遍歷分表二維數(shù)組,取得每一個一維數(shù)組,將一維數(shù)組中的每個分表替換分組SQL中對應(yīng)的原始表,并在此分組SQL上加排序和分組的功能即Order by和Group by,分組和排序都是用同一列數(shù)據(jù),該列數(shù)據(jù)稱之為排序列,排序列的值為每一具體的查詢參數(shù)值。
[0041]如圖2所示,設(shè)置一數(shù)據(jù)結(jié)構(gòu)建立本次查詢的查詢結(jié)果集的索引表,可創(chuàng)建HashMap用于存放每組查詢的合并后的索引數(shù)據(jù)。先創(chuàng)建一個保存總行數(shù)的變量,查詢返回的數(shù)據(jù)是一個列表,包括查詢參數(shù)值和查詢參數(shù)值對應(yīng)的二維數(shù)組兩列數(shù)據(jù)。然后遍歷這個列表,將每一行數(shù)據(jù)合并到HashMap中,即將查詢參數(shù)值相同的數(shù)據(jù)進行合并,HashMap的key是查詢參數(shù)值,HashMap的Value是有兩行的二維數(shù)組,存放查詢參數(shù)值對應(yīng)的索引數(shù)據(jù),即索引二維數(shù)組,第一行存放是同一查詢參數(shù)值對應(yīng)數(shù)據(jù)在每一分表中的行數(shù),第二行存入該分表在分表二維數(shù)組中的下標值。將每一查詢參數(shù)值的行數(shù)累加到總行數(shù)中,遍歷分表二維數(shù)組后,完成將所有索引數(shù)據(jù)存放HashMap中,并計算出了總行數(shù),再將這個HashMap和總行數(shù)保存在緩存中,緩存的Key值是分頁查詢SQL,Value是HashMap和總行數(shù),緩存超時時間默認是I分種。
[0042]S3、當(dāng)需要調(diào)取索引表內(nèi)待查詢頁的數(shù)據(jù)時,根據(jù)索引表定位該待查詢頁的數(shù)據(jù)所在的一組或多組分表;
[0043]當(dāng)需要調(diào)取索引表內(nèi)待查詢頁的數(shù)據(jù)時,輸入查詢的SQL、待查詢頁的開始位置和每頁的行數(shù)。通過SQL從緩存中查出HashMap。創(chuàng)建一個變量用于記錄已遍歷過的行數(shù),SP變量A。遍歷HashMap的Key值,通過Key值取得對應(yīng)的Value值,Value值是索引二維數(shù)組。將索引二維數(shù)組的行數(shù)累加,再和變量A相加,將相加后的值存在變量A中。如果變量A的值等于或大于待查詢頁的開始位置時,記錄下此數(shù)組的下標,此為開始下標,再用變量A值減去待查詢頁的開始位置,得到值再往后累加相應(yīng)的行數(shù),如果等于或大于每頁的大小,記錄下此數(shù)組的下標,此下標就是結(jié)束下標,通過開始下標和結(jié)束下標截取索引二維數(shù)組第二行數(shù)據(jù),截取出來的數(shù)據(jù)是一維組件,它存放是分表二維組件中分表的下標值,如此,可從分表二維數(shù)組找出多組分表。如果存在相同的分表,則把它們合平并,并且對應(yīng)的行數(shù)也累加,累加后的行數(shù)就是一組分表分頁查詢的行數(shù),再通過開始下標和結(jié)束下標計算出每一組分表查詢的開始位置。
[0044]S4、調(diào)取一組或多組分表的數(shù)據(jù),并顯示。
[0045]創(chuàng)建一個列表存儲每組分表查詢返回的經(jīng)果集,把它叫做結(jié)果集列表,遍歷這些多組分表,把每一組分表替換SQL對應(yīng)的原始表,通過開始位置和頁的行數(shù)在SQL上加上分頁的功能,然后通過SQL進行查詢返回結(jié)果集采用快速排序法進行排序。依次遍歷完所有的列表后,結(jié)果集列表就是分表排序分頁查詢的結(jié)果。
[0046]本發(fā)明實施例一以比較通用的方法解決了任何一種分表、排序、分頁查詢的問題。排序列是任何的列,不受限制。分表的規(guī)則也不受限制。采用排序索引定位每一組分表分頁數(shù)據(jù),速度快,索引數(shù)據(jù)結(jié)構(gòu)精簡,占用內(nèi)存少,通過緩存保存索引數(shù)據(jù),減少數(shù)據(jù)庫的查詢。本發(fā)明的功能可以封裝在一起,能用一行代碼處理完所