2013-02-08 126 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}