2013-02-08 122 views
1

我有一個數據庫表像這樣有大約100萬行:優化數據庫查詢嵌套數據

id prev curr next 
1  25  26  27 
2  26  27  28 
3  27  45  46 
4  45  46  47 
5  46  47  48 
6  47  59  41 
.............. 
.............. 

在Java端,我需要做的是,對於像 給定的輸入(CURR = 45和diff = 2),我需要得到像45,27,26這樣的項目列表。 對於輸入(curr = 59和diff = 1),我需要得到59,47 正如你在上面看到的, prev和next並不總是比curr值小1和1。

目前我在java中做的是基於差異值,我查詢表來獲得curr的prev。 然後使用prev作爲curr,我再次查詢表並繼續,直到我找到我想要的。但是對於像20或30這樣較高的差異值,這是過多的數據庫調用。

有沒有人有任何想法在1 DB查詢做這一切?由於表中的行數太多,因此在本地獲取並保留數據不是一種選擇。

與編輯答案評論:

  • 表包含其他列太等數據將不僅是16MB。我只是刪除了不相關的列。
  • curr字段中沒有重複。
  • 還有其他函數使用curr和nextv類似於prev和curr。
  • 這不是一棵樹的結構。所以最後一行是一個有效的行。
+0

我不認爲你可以做到這一點使用一個查詢,可能與20個查詢可以覆蓋鏈lenght高達20但這是荒謬的。爲這個任務寫一個存儲過程可能是最好的。 在極端的情況下,你會經常做這麼長的鏈,其中有一百萬行不是很多數據,只有大約16Mb – 2013-02-08 16:31:24

+0

curr字段中可能有重複的值嗎?如果是這樣,你想做什麼? – 2013-02-08 16:33:16

+0

爲什麼你需要將'prev','current'和'next'作爲表中的列? 「當前」和「下一個」不夠?你可以在'current'和'next'的幫助下確定'prev'。 – jlordo 2013-02-08 16:33:29

回答

1

,你可以自聯接的時間(基於對diff值表X號,但是這可能不是,如果你需要支持大值diff做的事情非常有效的方式。

這對我來說似乎是一個模式問題,如果沒有進一步的理解如何在寫入數據庫時​​分配項目的順序,就很難給出關於如何更改模式以便更容易讀取的建議查詢

+0

你可以舉一個如何自我連接n次的例子嗎? – kriver 2013-02-19 15:19:01

0

分層數據:curr prev前導,所以prev + curr是關係型SQL中的缺失操作。

您可以創建一個prev +表作爲(curr,prevplus,level),以便prev^level可以提供prevplus。填寫這樣的表格並不是那麼困難,甚至可以做到變化;在MySQL(由於自引用)與臨時表。

然後查詢將與level <= 2

當然,表格prevplus會變大。

+0

由於每個curr項目的差異值最高可達32,因此這將增加prevplus表格的32倍。 – kriver 2013-02-14 19:48:19

0

我想你可以到這兩個調用數據庫:

SELECT id, curr, next FROM ... 

應該仍然是數據的相對較少。

從那裏,通過javascript diff數據循環遍歷數據來找到你需要的id。

然後:

SELECT * from ... WHERE id = {the record you need}