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), I need to get 59, 47 上記のように、prev と next は常に curr 値より 1 小さく、1 大きいとは限りません。

現在、私が Java で行っていることは diff 値に基づいています。テーブルにクエリを実行して、curr の前の値を取得します。次に、prev を curr として使用して、再度テーブルにクエリを実行し、探しているものが得られるまで続行します。しかし、20 や 30 などのより高い diff 値の場合、これは DB 呼び出しが多すぎます。

このすべてを 1 つの DB クエリで実行することについて考えている人はいますか? テーブル内の行が多すぎるため、データをローカルにフェッチして保持することはできません。

コメントへの回答で編集:

  • テーブルには他の列も含まれているため、データは 16MB だけではありません。関係のない列を切り取っただけです。
  • curr フィールドに重複はありません。
  • prev および curr と同様に、curr および next 列を使用する関数は他にもあります。
  • これはツリー構造ではありません。したがって、最後の行は有効な行です。
4

3 に答える 3

1

テーブルを X 回自己結合できます ( の値に基づいていますがdiff、 の大きな値をサポートする必要がある場合、これはおそらくあまり効率的な方法ではありませんdiff

これはスキーマの問題のように思えます。データベースへの書き込み時にアイテムの順序を割り当てる方法をさらに理解していなければ、クエリを読みやすくするためにスキーマを変更する方法について提案することは困難です。

于 2013-02-08T16:32:21.847 に答える
0

階層データ:prev of prev of prev of currであるため、prev +ofcurrはリレーショナルSQLで欠落している操作です。

prev +テーブルを(curr、prevplus、level)として作成すると、prevplusがprev^level得られます。このようなテーブルを埋めるのはそれほど難しくなく、変更することもできます。mysqlで(自己参照のため)一時テーブルを使用します。

次に、クエリはで行われlevel <= 2ます。

もちろん、テーブルprevplusは大きくなります。

于 2013-02-08T16:39:43.440 に答える