2

主キーが欠落している問題を修正する必要があります。それを行うための最良の方法についていくつかのアイデアを入手したいと思います。

いくつかの本番データベースにプログラムがあり、1時間ごとに新しいデータを合計テーブルに挿入します。5つの列がキーであり、他の列は異なる合計である値です。ON DUPLICATE KEY UPDATEを使用して、挿入ごとに合計を追加します。insertステートメントは次のようになります。

INSERT INTO sums (key1,key2,key3,key4,key5,sum1,sum2) VALUES (..., 13, 42, 3)
ON DUPLICATE KEY UPDATE sum1=VALUES(sum1)+sum1,sum2=VALUES(sum2)+sum2

問題は、テーブルが作成されたときに主キーが設定されていなかったことです(私のせいではありません:)。次に、同じキーを持つ行を集約してから、主キーを追加する必要があります。主キーが欠落しているため、いくつかのシステムでテーブルが約700 000 000行に増えたため、これを行うための効率的な方法が必要です。

1時間ごとに新しい行の追加を延期することなく、それを実行したいと思います。システムが動作する方法で、インサートを保存して後で実行するには、多くの作業が必要になるためです。

私が行うすべての操作は、45分以上テーブルをロックすることはできません。最初にいくつかの行をマージすることに成功した場合、実際の主キーの作成にかかる時間がそれよりも短くなることを願っています。たぶん、最初にいくつかのキー列のインデックスを作成する方が速いので、行の集計操作に使用するインデックスがありますか?

行を集約するための最良の方法もわかりません。良い提案をいただければ幸いです。

4

2 に答える 2

1

まず、既存の sums テーブルの名前を sums_old に変更し、新しい正しい sums テーブルを作成して、時間単位のプロセスを継続できるようにします。ただし、集計データを適用するまで、合計テーブルのデータは正しくないことに注意してください。

ここで、次のクエリを適用してテーブルを更新します。

INSERT INTO sums (key1, key2, key3, key4, key5, sum1, sum2)
SELECT key1, key2, key3, key4, key5, sum1, sum2 FROM sums_old
ON DUPLICATE KEY UPDATE sum1 = VALUES(sum1) + sum1, sum2 = VALUES(sum2) + sum2

ただし、MyISAM を使用していて、テーブルを長時間ロックしたくないので、LIMIT を使用してチャンクで行います。

INSERT INTO sums (key1, key2, key3, key4, key5, sum1, sum2)
SELECT key1, key2, key3, key4, key5, sum1, sum2 FROM sums_old
ORDER BY some_index
LIMIT 0, 250000
ON DUPLICATE KEY UPDATE sum1 = VALUES(sum1) + sum1, sum2 = VALUES(sum2) + sum2

INSERT INTO sums (key1, key2, key3, key4, key5, sum1, sum2)
SELECT key1, key2, key3, key4, key5, sum1, sum2 FROM sums_old
ORDER BY some_index
LIMIT 250000, 250000
ON DUPLICATE KEY UPDATE sum1 = VALUES(sum1) + sum1, sum2 = VALUES(sum2) + sum2

INSERT INTO sums (key1, key2, key3, key4, key5, sum1, sum2)
SELECT key1, key2, key3, key4, key5, sum1, sum2 FROM sums_old
ORDER BY some_index
LIMIT 500000, 250000
ON DUPLICATE KEY UPDATE sum1 = VALUES(sum1) + sum1, sum2 = VALUES(sum2) + sum2

...

チャンクで行うには、いくつかのキーで注文する必要があるため、キーがない場合は、sums_old テーブルに追加する必要があります。

適切なチャンク サイズを把握します。

于 2012-08-08T13:48:33.637 に答える
0

私はそれらを集約するためにこのようなことを試みると言います

select key1,key2,key3,k4,key5,
convert(key1 as varchar) + convert(key2 as varchar) + convert(key3 as varchar) + convert(k4 as varchar) + convert(key5 as varchar) as Pk
from sums
group by key1,key2,key3,k4,key5
having distinct(convert(key1 as varchar) + convert(key2 as varchar) + convert(key3 as varchar) + convert(k4 as varchar) + convert(key5 as varchar))

羨ましくないよ、700Mはあてがわれてるし、やりたいことみたいな操作にはそれなりの時間がかかると思うよ。

お役に立てれば

乾杯

于 2012-08-08T12:32:54.393 に答える