2017-06-08 5 views
0

MySqlデータベースには、常にアクセスされる一連の関連データ(合計50,000行で容量が少ない)が含まれています。 。定期的に(1日1回)、すべてのテーブルのすべてのデータを更新する必要があります(フルリフレッシュ)。永久にアクセスしている間に複数のテーブルを更新する

私は2つの可能性を考慮しています:読み込み/ロック

  • がをバージョン管理を使用

    • 使用取引を、私はそれと連携するかどうかはわかりません:バージョンを追加します同じバージョンの同じ「パブリケーション」にすべての行を設定します。次のパブリケーションにはバージョン+1があり、下位バージョンの行は削除できます。現在のバージョンはパラメータテーブルに格納されているので、読み取りクエリは常に最新の使用可能なバージョンを選択できます。

    誰もが両方のソリューションを試していますか?または任意の異なる/より良い解決策?データベース全体を交換するテーブル全体

    CREATE TABLE new LIKE real; 
    populate `new` with the new stuff -- the slow part 
    RENAME TABLE real TO old, 
          new TO real; -- atomic and fast. 
    

    交換

    おかげで

  • +0

    ロックとトランザクションを混在させています。それらは関連した概念ですが、まだ異なります。トランザクションは、データへの一連の変更がまったく起こるかどうかを確認します。トランザクション対応テーブルエンジンを使用する場合は、何を問わずデータを変更するときにトランザクションを使用します。だから、あなたは2つの解決策、1つしか解説しませんでした。 – Shadow

    +0

    2つの主な種類のソリューションがあります。更新レコードを挿入するか、挿入します(1つのテーブルとバージョン管理または2つの同一のテーブルが交互に表示されます)。あなたはあなたのために一番良いものを自分でテストする必要があります。 – Shadow

    答えて

    0

    :各テーブルで上記の操作を行いますが、他のすべての作業が完了するまでRENAMEsを行うために延期します。その後、すべてを単一のRENAME TABLEステートメントで実行します。

    ロックなし、トランザクションなし、何もありません。

    +0

    myisamテーブルエンジンを使用することを推奨している場合を除き、移入ビットはトランザクションを使用します:) – Shadow

    +0

    テーブルの名前を変更すると、テーブルがロックされるので、それが持続する間にほかの操作にアクセスすることはできません。同じ構造のテーブルを2つ用意し、名前を変更せずにそれらのテーブルを交互に置き換えてください。 – Shadow

    +0

    'RENAME'の代わりにクライアントを変更したい場合は、先に進んでください。 –

    関連する問題