2012-03-07 8 views
1

私はここで多くの時間をかけて解決策を見つけるために来てくれました。そして、ついに私は最初の質問を書こうと決めました。テーブル内の複数のパーティションをサブパーティション化

私は初めてデータベースをパーティション化してマウントする必要がありますが、単純なパーティション化ではないので、mysql公式ドキュメントには解決策が見つかりませんでした。

私は、このテーブルがあります。

CREATE TABLE SystemEvents 
(
    ID int unsigned not null auto_increment primary key, 
    ReceivedAt datetime NULL, 
    DeviceReportedTime datetime NULL, 
    Facility smallint NULL, 
    Priority smallint NULL, 
    FromHost varchar(60) NULL, 
    Message text, 
    NTSeverity int NULL, 
    EventSource varchar(60), 
    EventUser varchar(60) NULL, 
    EventCategory int NULL, 
    EventID int NULL, 
    InfoUnitID int NULL , 
    SysLogTag varchar(60), 
    EventLogType varchar(60), 
) 

をそして私は "FromHost" キーでパーティションを作成する必要があります。それはすべてOKです

PARTITIOM BY LIST (FromHost) 
(
    PARTITION p01 VALUES IN ('server1'), 
    PARTITION p02 VALUES IN ('server2'), 
    PARTITION p03 VALUES IN ('server3', 'server4'), 
    PARTITION p04 VALUES IN less than maxvalue 
); 

ここまで。

メインテーブルをいくつかのサーバに分割したら、すべてのパーティションの内容を日付フィールド(receivedAt)でサブパーティションに分割する必要があります。

理由は、データベースは1年を通して企業内のすべてのサーバーのイベントを格納しなければならず、 "server1"と "server2"の両方が毎月3ミリオンの行を作成するからです。私たちが必要とするほとんどのクエリは、まずサーバーによって行われ、選択したサーバーに対してフィルタリングされたイベントのリストが取得されると、日付で検索して、探しているイベントを見つけます。

したがって、サブパーティションをp01およびp02パーティションに作成するスクリプトをreceivedAtフィールドでソートする方法を教えてください。

理解できないことがある場合は教えてください。私はそれを言い換えます。

ありがとうございます。

よろしくお願いいたします。 Xavidpr

答えて

0

パーティションに使用されるすべての列は、表に主キーがある場合は主キーの一部でなければなりません。

次に、varchar列であるFromHostでパーティションを作成します。 varcharを使用すると、使用できるパーティションの種類が制限されます。また、テーブルがパーティションを保証するのに十分な大きさであれば、ホスト名の代わりにホストの数値IDを使用することをお勧めします。これにより、処理速度が向上し、テーブルサイズも小さくなります。 DateTimeの上partitioingため

使用RANGEパーティショニング:

まっすぐ進むのソリューションはこれだろう。ホスト上のパーティショニングのため 使用キーまたはハッシュ分割(好ましくは整数HOST_ID)

あなたがサブパーティションにRANGEを使用することができないので、他の言葉パーティションにKEY又はHASH

によってRANGEおよびサブパーティションにより分割する必要がありますReceivedAtおよびサブパーティションby FromHost

関連する問題