私は mysql を使用しており、10,000 のブロックで 4 つの部分の主キーを持つ非常に大きなテーブルを処理したいと考えています (別のシステムへのデータのマーシャリング)。処理中はデータベースがオフラインなので、変更について心配する必要はありません。主キーが ( A
、B
、C
、D
) であり、すべて整数であるとします。私は最初LIMIT OFFSET
にこのようにこれを達成するために使用しようとしました:
SELECT * FROM LargeTable ORDER BY (A, B, C, D) LIMIT 10000 OFFSET 0;
各呼び出しでオフセットを 10000 ずつ増やしました。これは、テーブルの上位の行に近づくにつれて非常に遅くなるように見えました。これをLIMIT OFFSET
効率的に行うことはできませんか?
次に、複合主キーの比較を使用する別のアプローチを試しました。次のように最初のブロックを取得できます。
SELECT * FROM LargeTable ORDER BY (A, B, C, D) LIMIT 10000;
そのブロックの最後の行に , , が含まれている場合A = a
、B = b
次C = c
のD = d
ブロックを取得できます。
SELECT * FROM LargeTable
WHERE
A > a OR
(A = a AND B > b) OR
(A = a AND B = b AND C > c) OR
(A = a AND B = b AND C = c AND D > d)
ORDER BY (A, B, C, D) LIMIT 10000;
そして、ブロックごとにそれを繰り返します。これも、テーブルの上位の行に到達するにつれて大幅に遅くなるように見えました。これを行うより良い方法はありますか?明らかな何かが欠けていますか?