2011-01-12 22 views
2

ログレポートの過去45日間を統計レポートの目的でMySQLテーブルに保存したいと考えています。毎日20〜300万行になる可能性があります。私は、フラットファイルを作成し、毎日そこにデータを取得するためにデータを読み込むinfileを使用することを計画しています。理想的には、毎日パーティションを作成するためのスクリプトを書かなくても、毎日それを自分のパーティションにしたいと思っています。MySQLで一日ごとにMyISAMテーブルを分割する方法

MySQLには、毎日自分のパーティションを自動的に取得する方法がありますか?

おかげ

答えて

1

私は強くログなどの高トラフィックデータを保存するためにMySQLのではなく、Redisやカサンドラを使用してお勧めします。その後、毎日の輸入よりも、一日中ストリーミングできるようになりました。

comparison of "NoSQL" databasesでは、これらの2つ(以上)の詳細を読むことができます。

MySQLを主張しているのなら、最も簡単なのは、logs_2011_01_13のように1日に新しいテーブルを作成してそこにロードするのが最も簡単だと思います。これにより、古い日付を簡単に削除することができます。また、異なるサーバー上の異なるテーブルを簡単に移動することもできます。

+1

redisは特別なSQLクエリをサポートしておらず、Cassandraは2千万〜3千万の行に対して不安定であり、不安定です。 – James

+0

明らかに、それらはSQLエンジンではありません。私はそうではないふりをしています。 Redisはかなりの分析をすることができますが、確かに同じではありません。私はカサンドラをお勧めしません。あなたにはたくさんのノードを持つお金が必要です。私の答えの最後のビットはMySQLに対処しようとしていた。 – Seldaek

0

えー...、一日あたり

真剣1表は、有効な提案だった...それらを複合キーとサイクルとのMod 45でそれらを数であり、それは静的なデータであるので、私はパックされたMyISAMテーブルを作成し、私のホストのソート能力に依存します。

これらの一部またはすべてを結合するクエリを作成するのは、やや難しいことです。

1日に1つのテーブルを作成し、負荷のパフォーマンスを向上させるためにパーティションを分割します。

0

はい、あなたが日付でMySQLのテーブルを分割することができます:あなたはパーティションpNに溢れに近づくとき

CREATE TABLE ExampleTable (
    id INT AUTO_INCREMENT, 
    d DATE, 
    PRIMARY KEY (id, d) 
) PARTITION BY RANGE COLUMNS(d) (
    PARTITION p1 VALUES LESS THAN ('2014-01-01'), 
    PARTITION p2 VALUES LESS THAN ('2014-01-02'), 
    PARTITION pN VALUES LESS THAN (MAXVALUE) 
); 

その後、あなたはそれを分割することができます:

ALTER TABLE ExampleTable REORGANIZE PARTITION pN INTO (
    PARTITION p3 VALUES LESS THAN ('2014-01-03'), 
    PARTITION pN VALUES LESS THAN (MAXVALUE) 
); 

これはありません自動的にパーティションを作成しますが、必要に応じて再編成することもできます。最後のパーティションを満たす前に再編成するのが最善です。そのため、操作は迅速になります。

0

私は何か他のものを探している間にこの質問に遭遇し、MERGEストレージエンジン(http://dev.mysql.com/doc/refman/5.7/en/merge-storage-engine.html)を指摘したかったのです。

MERGEストレージは多かれ少なかれ複数のテーブルへの単純なポインタであり、数秒でやり直すことができます。サイクリングログの場合は、非常に強力です!私がやるべきことは次のとおりです:

1日に1つのテーブルを作成するには、LOAD DATAをOP NOTとして使用して記入してください。完了したら、MERGEテーブルを削除し、古いテーブルを削除しながらその新しいテーブルを含めて再作成します。いったん完了すると、古いテーブルを削除/アーカイブすることができました。これにより、特定の日にすばやくクエリを実行できるようになるか、orignalテーブルとMERGEの両方が有効になります。

CREATE TABLE logs_day_46 LIKE logs_day_45 ENGINE=MyISAM; 
DROP TABLE IF EXISTS logs; 
CREATE TABLE logs LIKE logs_day_46 ENGINE=MERGE UNION=(logs_day_2,[...],logs_day_46); 
DROP TABLE logs_day_1; 

MERGEテーブルはPARTIONNEDテーブルと同じではなく、いくつかの利点と不都合があります。しかし、すべてのテーブルから集計しようとすると、すべてのデータが1つのテーブルにある場合よりも処理が遅くなることに注意してください(基本的に異なるテーブルであるため、パーティションについても同様です)。主に特定の日にクエリを実行する場合は、自分でテーブルを選択する必要がありますが、パーティションが曜日の値で行われると、MySQLは自動的に正しいテーブルを取得します。

関連する問題