2

私はMySQLDBを持っており、ソースから毎週1回、特定の曜日の特定の時間(約120万行)に大量のデータを受信し、それを「ライブ」テーブルと呼びます。

「ライブ」テーブルからすべてのデータをアーカイブにコピーし、ライブテーブルを切り捨てて、次の週に来る次の「現在のデータ」用のスペースを作りたいと思います。

誰かがこれを行うための効率的な方法を提案できますか?私は本当に避けようとしています-archive_tableに挿入select*fromlive-。PHPを使用してこのアーカイバを実行できるようにしたいので、Maatkitを使用できません。助言がありますか?

編集:また、アーカイブされたデータはすぐにアクセスできる必要があります。すべての挿入にはタイムスタンプが付いているので、先月のデータを検索したい場合は、アーカイブで検索するだけです。

4

3 に答える 3

2

卑劣な方法:

レコードをコピーしないでください。それには時間がかかりすぎます。

代わりに、邪魔にならないようにライブテーブルの名前を変更して、次のように再作成します。

RENAME TABLE live_table TO archive_table;
CREATE TABLE live_table (...);

それは非常に速く、痛みがないはずです。

編集:私が説明した方法は、ローテーションごとのアーカイブテーブルが必要な場合に最適に機能します。単一のアーカイブテーブルを維持したい場合は、もっと注意が必要かもしれません。ただし、履歴データに対してアドホッククエリを実行したいだけの場合は、おそらくUNIONを使用できます。

数期間分のデータのみを保存したい場合は、ログローテーションと同様の方法で名前の変更を数回行うことができます。次に、アーカイブテーブルを1つの大きなhonkin'テーブルにUNIONするビューを定義できます。

EDIT2:自動インクリメントのものを維持したい場合は、次のことを試してみてください。

RENAME TABLE live TO archive1; 
CREATE TABLE live (...); 
ALTER TABLE LIVE AUTO_INCREMENT = (SELECT MAX(id) FROM archive1);

しかし悲しいことに、それはうまくいきません。ただし、PHPを使用してプロセスを推進している場合は、これを回避するのは非常に簡単です。

于 2011-04-12T20:33:49.470 に答える
1

cronジョブとして実行するスクリプトを次のように記述します。

  1. 「ライブ」テーブルからアーカイブデータをダンプします(これは、シェルスクリプトからmysqldumpを使用するとおそらくより効率的です)
  2. ライブテーブルを切り捨てます
  3. テーブル名がライブテーブルではなくアーカイブテーブルを参照するように、ダンプファイルのINSERTステートメントを変更します。
  4. アーカイブデータをアーカイブテーブルに追加します(ここでも、シェルスクリプトを介してダンプファイルからインポートできます(例:mysql dbname <dumpfile.sql))。
于 2011-04-12T19:44:15.330 に答える
0

これは、データをアーカイブした後でデータをどのように処理しているかによって異なりますが、MySQLレプリケーションの使用を検討しましたか?

別のサーバーをレプリケーションスレーブとして設定し、すべてのデータがレプリケートされたら、SET BIN-LOG 0そのステートメントもレプリケートされないように、削除するか、前に切り捨てます。

于 2011-04-12T19:47:50.867 に答える