优化嵌套数据的db查询

时间:2013-02-08 16:26:29

标签: java mysql sql database performance

我有一个这样的数据库表,大约有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中所做的是基于diff值,我在查询表中得到了curr的prev。 然后使用prev作为curr,我再次查询表并继续直到我得到我正在寻找的东西。但是对于更高的差异值,如20或30,这是太多的数据库调用。

有没有人想过在1个数据库查询中完成所有这些操作?由于表中的行太多,因此无法在本地获取和保存数据。

编辑回答评论:

  • 该表也包含其他列,因此数据不仅仅是16MB。我只是删掉了不相关的列。
  • 在curr字段中没有重复。
  • 还有其他功能使用curr和next列类似于prev和curr。
  • 这不是树结构。所以最后一行是有效行。

3 个答案:

答案 0 :(得分:1)

您可以自动加入表X次数(基于diff的值,但如果您需要支持{{1}的大值,这可能不是一种非常有效的方法。 }}

这对我来说似乎是一个架构问题。如果没有进一步了解在写入数据库时​​如何分配项目的顺序,就很难就如何更改模式提供建议,以便更容易地进行读取查询。

答案 1 :(得分:0)

分层数据:curr的上一个流行趋势,因此 prev + of curr 是关系SQL中缺少的操作。

你可以创建一个prev + table作为(curr,prevplus,level),以便prev^level给出prevplus。 填写这样的表格并不困难,甚至可以进行更改;在mysql中(因为自引用)带有临时表。

然后查询将与level <= 2

当然,表格普遍变大。

答案 2 :(得分:0)

我认为你可以通过两个db调用来实现这个目的:

SELECT id, curr, next FROM ...

应该仍然是相对少量的数据。

从那里,使用javascript diff#次循环数据,找到你需要的id。

然后:

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