2017-12-12 6 views
0

5分ごとに完全にリフレッシュする必要がある約150万行のデータが格納されたテーブルを備えたMySQLデータベースがあります。 5分以上経過するとデータは不要になります。5分ごとに150万行のデータセットを置換する

テーブルにデータを取得することは問題ありません。約50〜70秒でデータを入力できます。私がいくつかの問題を抱えているのは、すべての古いデータをシフトして新しいデータに置き換える方法を考え出すことです。データセット全体でいつでもクエリを実行できるようにする必要があります。これらのクエリは非常に高速に実行する必要があり、一度に1つのデータセットのデータのみを含む必要があります(つまり、クエリがテーブルが更新されている1分間に新しいデータと古いデータの組み合わせを取得してはいけません)。

大規模な一時データセットの使用経験はあまりありません。この問題を解決するにはどうすればよいのかアドバイスをいただきたいと思います。

+1

あなたは 'DELETE'ステートメントを使うことができますが、@RolandStarkeのアイデアは良いです。テーブルの名前を変更したり、新しいテーブルを作成したり、新しいデータを作成してから最初のテーブルを削除する方が速いでしょう。 – Fleury26

+0

DELETEアプローチはトランザクション内にある必要があります。つまり、削除および再挿入中に1分以上テーブルがロックされます。 DELETEはオープン読み取り中もブロックされます。 RENAMEオプションは、そのDDLとしてトランザクション内にあることさえできません。 – MatBailie

答えて

0

パーティションを作成します。ユーザーが別のパーティションから照会している間に、1つのパーティションにデータを入れることができます。

CREATE TABLE tbl0 (blah) 
CREATE TABLE tbl1 (blah) 
CREATE TABLE meta (combined_source INT) 
INSERT INTO meta VALUES (0) 

CREATE VIEW combined AS 
    SELECT * FROM tbl0 WHERE 0 = (SELECT combined_source FROM meta) % 2 
    UNION ALL 
    SELECT * FROM tbl1 WHERE 1 = (SELECT combined_source FROM meta) % 2 

は今、あなたは「非アクティブ」テーブルに新しいデータを挿入することができ、それがビューに表示されません...あなただけのようなものが必要手動でこれを行うにしてください。

次に、値をmetaに増やします。直ちに、ビューは、あるテーブルのデータを表示することから、別のテーブルのデータを表示することに切り替わります。

次回の反復では、metaをチェックして、空にして新しいデータを読み込むことを決定します。

このアプローチの利点の1つは、トランザクション内にいなくてもよいということです。

関連する問題