次のような巨大なテーブル (1b レコード) を取得しました: char(3), char(3), date, [6 more ints].
手続き型の mysql で非常に単純な機能を探していますが、見つかりません。現在のカーソル位置の行を削除します。
私がする必要があるのは:
- (char, char, date) インデックスでテーブルを並べ替える
- 現在の行を最初の行に設定します
- ランクを0にする
- ランク > max_rank の場合、現在の行を削除します。
- 次の行に移動します。ランクに1を追加
- インデックスの 3 つの値のいずれかが変更された場合、ランクを 0 にリセットする可能性があります
- 4に行く
疑似 C# では、とても単純です。
var b = new List<Row>(1000000000) { ... };
b.Sort():
var r = 0;
var prev_b = b[0];
for (var i = 0; i < b.Count; i++)
{
if (r > mr) { b.RemoveAt(i); i--; }
if (b[i].x != prev_b.x) r = 0;
else r++;
prev_b = b;
}
mysql でそれほど効率的にそれを行うことが不可能な場合、次善の方法は何ですか?
私のアイデア(すべてmysqlプロシージャとして):
アイデア I:
- テーブルをループし、削除する必要がある行のキーの配列を作成します
- 配列をたとえば 1000000 個の小さな配列に分割します
- 小さな配列ごとに、それらのキーを持つ行を削除する DELETE ステートメントを作成して実行します
アイデア II:
- テーブルをループし、削除してはならない行を別の新しいテーブルに 1 つずつ挿入します。
- 古いテーブルを削除し、新しいテーブルの名前を変更します
アイデア III:
- テーブルをループし、削除してはならない行を別の新しいテーブルに挿入します。たとえば、10000 行のバッチで挿入します。
- 古いテーブルを削除し、新しいテーブルの名前を変更します
どのアイデアが一番いいですか?
今、私はこれにPHPを使用しています!正しく数えることができれば、このプロセスで 3 つのデータのコピーが使用されます。1 つは常にハードディスクに保存されているデータで (直接処理したい)、2 番目はmysql_query()
PHPの結果のバッファです。関数呼び出し [おそらくメモリ内またはハードディスク上でも] であり、THE THIRD は実際の PHP 配列であり、最終的にループして削除することができます。