1

CSV から毎週更新する必要がある静的テーブルを含むデータベースがあります。テーブルはMysql MyISAMであり、静的とは、読み取り専用に使用されることを意味します(明らかにCVSから更新された場合を除く)。

約 50 のテーブルがあり、合計で約 200 MB のデータが毎週再ロードされます。

私は3つの方法について考えることができます:

  1. テーブルの切り捨て
  2. ファイルからデータをロードする

または

  1. テーブルごとに一時テーブルを作成します
  2. そこにデータをロードする
  3. 元のテーブルを切り捨てます (または行を削除しますか?)
  4. 元のテーブルに挿入 * 一時テーブルから選択します。

または

  1. table_new を作成し、そこにデータをロードします
  2. 元のテーブルの名前を table_old に変更します (またはテーブルを完全に削除します)
  3. table_new の名前を元のテーブルに変更します

最も効率的な方法は何だと思いますか?

4

4 に答える 4

0

mysqlimportの使用を検討しましたか?あなたはここでそれについて読むことができます:http: //dev.mysql.com/doc/refman/5.1/en/mysqlimport.html

元のテーブルを削除しても、おそらく何もしません。外部キー、インデックス、制約などをすべて再作成する必要があるため、混乱とメンテナンスの悪夢です。テーブルの名前を変更すると、問題が発生する可能性もあります(たとえば、テーブルの同義語がある場合、mysqlに同義語があるかどうかはわかりません)。

ただし、データをロードする前にキーを無効にします。

ALTER TABLE tbl_name DISABLE KEYS 

つまり、データをロードするときに、インデックスの更新を試みたくない場合は、ロードが遅くなります。ロードが完了したら、インデックスを更新する必要があります。

したがって、mysqlimportを上記のヒントと組み合わせることで、非常に効率的なロードを取得できるはずです。

于 2009-12-29T04:51:22.097 に答える
0

あなたはいつでもすることができますINSERT INTO ... ON DUPLICATE KEY UPDATE ...またはREPLACE INTO .... (TRUNCATE と INSERT の間の) ダウンタイムが発生することはなく、破損する可能性はほとんどありません。

REPLACE実際には各レコードを削除して再挿入し、(この場合はありそうにない) トリガーを起動しますが、自動インクリメント フィールドがある場合は新しい ID も提供するため、注意してください。

于 2010-01-28T04:02:31.230 に答える
0

3番目のオプションが最適です。インポート中に _new テーブルのキーをロックおよび無効にすることができ、非常に高速です。すべての新しいテーブルを「現在のテーブル」に「バッチ アトミック リネーム」することもできます。それらの間に関係がある場合、ダウンタイムはゼロです。

テーブル全体が毎週の cvs 更新に含まれていると仮定しています (つまり、それらは増分ではありません)。

于 2010-01-28T04:02:36.327 に答える
0

私は3番目の方法を好み、古いテーブルも保持します。

  1. table_new を作成
  2. table_old が存在する場合はドロップします
  3. テーブルの名前を table_old に変更
  4. table_new の名前を table に変更

この方法の利点は、読者への影響が少なく、高速で安全であることです。新しいテーブルの作成は、既存のテーブルの読み取りには影響しません。名前の変更操作は高速であるため (myisam の場合はファイルの名前変更のみ)、ダウンタイムはそれほど長くありません。したがって、クライアントはこれによってそれほど影響を受けません。また、新しいデータに問題が発生した場合に備えて、古いデータを保持する必要があります。

オンラインで更新するつもりはないので、myisampack をすると良いと思います。

于 2010-01-28T04:06:33.920 に答える