2011-06-24 12 views
1

私は、定期的に新しいデータで完全に再生成されるdbテーブルを持っています。このデータは、対応するライブDBテーブルにプッシュされ、以前のライブデータが上書きされる必要があります。ライブデータベーステーブルを更新するための良い方法は何ですか?

テーブルのサイズが大きくなると、ライブテーブルにデータをプッシュするのに必要な時間も長くなり、アプリケーションは欠落しているように見えます。

新しいデータをlive_tempテーブルにプッシュし、このテーブルでSQL RENAMEコマンドを実行して、ライブテーブルとして名前を変更します。名前の変更は、通常、1秒未満で実行されます。これはこの問題を解決する "正しい"方法ですか?

この問題に取り組むための他の戦略やツールはありますか?ありがとう。

答えて

0

ライブのテーブルに変更を加えるだけでよいですか?私が取り組んだほとんどのアプリケーションでは、変更は最小限に抑えられています。 1回のトランザクションですべての変更を適用できるはずです。トランザクションをコミットすると、テーブル上で停止せずにトランザクションが表示されます。

データが完全に変更された場合は、1回のトランザクションですべてのデータを置き換えることができるようにデータベースを構成できます。

1

このようにスキーマオブジェクトを混乱させるのは嫌いです。クエリオプティマイザを混乱させる可能性があります。リネームを実行している間に起こっているトランザクションがどうなるか分かりません。

バージョンの列をテーブルに追加し、現在のバージョンを保持する別のテーブルを用意するほうがはるかに好きです。

こうすることで、クライアントコードは、これも周りの履歴を保持

select * 
from myTable t, 
    myTable_currentVersion tcv 
where t.versionID = tcv.CurrentVersion 

になります - または有用などのでなくてもよいです。そうでない場合は、CurrentVersion列を設定した後に古いレコードを削除します。

+0

ありがとうございます!私は、テーブル名に新しいバージョンを追加する新しいテーブルを設定することもできます。次に、クライアントはcurrent_versionテーブルを検索し、それに応じて最新のテーブルを検索することができます。これにより、既にかなり大きなテーブルに全く新しい列を追加することを避けることができます。 –

+0

また、MySQL Renameコマンドがアトミックであることが判明しました。たとえば、RENAME TABLE table1 TO table_bak、table_temp TO table1は1ステップで実行され、table1が常にクライアントにアクセス可能であることを保証します。私はこれが今私がやることだと思います!つまり、Renameは外部キーを保持しないので、InnoDBと外部キー(私たちはMyISAMを使用しています)を使用するときにスキーマを混乱させる可能性があります。ありがとう。 –

1

重複するテーブルと完全なコピーを作成します。

"最新の"テーブルを記録するだけの新しいテーブルを作成します。 MostCurrent(テーブル) id(列) - 「最新の」データを保持するテーブルの名前を保持します。

再作成するときは、古いテーブルにデータを取り込み、このテーブルを反映するようにMostCurrent.idを更新します。

ここで、データをページにバインドするアプリで、最新の表をバインドします。

+0

ありがとう!あなたの答えと@ Nevilleの間のどちらかを選択するのは難しい –

+0

スワップが行われている間に更新/挿入が行われる可能性があるので、これはまだデータを最新の状態に保つことができないとします。 – Induster

関連する問題