0

次のような巨大なテーブル (1b レコード) を取得しました: char(3), char(3), date, [6 more ints].

手続き型の mysql で非常に単純な機能を探していますが、見つかりません。現在のカーソル位置の行を削除します。

私がする必要があるのは:

  1. (char, char, date) インデックスでテーブルを並べ替える
  2. 現在の行を最初の行に設定します
  3. ランクを0にする
  4. ランク > max_rank の場合、現在の行を削除します。
  5. 次の行に移動します。ランクに1を追加
  6. インデックスの 3 つの値のいずれかが変更された場合、ランクを 0 にリセットする可能性があります
  7. 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:

  1. テーブルをループし、削除する必要がある行のキーの配列を作成します
  2. 配列をたとえば 1000000 個の小さな配列に分割します
  3. 小さな配列ごとに、それらのキーを持つ行を削除する DELETE ステートメントを作成して実行します

アイデア II:

  1. テーブルをループし、削除してはならない行を別の新しいテーブルに 1 つずつ挿入します。
  2. 古いテーブルを削除し、新しいテーブルの名前を変更します

アイデア III:

  1. テーブルをループし、削除してはならない行を別の新しいテーブルに挿入します。たとえば、10000 行のバッチで挿入します。
  2. 古いテーブルを削除し、新しいテーブルの名前を変更します

どのアイデアが一番いいですか?

今、私はこれにPHPを使用しています!正しく数えることができれば、このプロセスで 3 つのデータのコピーが使用されます。1 つは常にハードディスクに保存されているデータで (直接処理したい)、2 番目はmysql_query()PHPの結果のバッファです。関数呼び出し [おそらくメモリ内またはハードディスク上でも] であり、THE THIRD は実際の PHP 配列であり、最終的にループして削除することができます。

4

0 に答える 0