mysql月別パーティション

5116 ワード

一、概説
MySQLの総記録数が100万を超えると、性能の大幅な低下はありますか?答えは肯定的ですが、パフォーマンスの低下>の割合は異なり、システムのアーキテクチャ、アプリケーション、インデックス、サーバハードウェアなど多くの要因によって異なります.あるネットユーザーが私にこの質問をしたとき、私の最もよくある答えは、id区間や時間の前後順など多くのルールに基づいて表を分けることができます.表分けは簡単ですが、これによってもたらされるアプリケーションやアーキテクチャの変更作業は、将来の拡張性なども含まれています.
以前は、MERGEタイプを使っていましたが、とても便利な料理でした.アーキテクチャとプログラムは基本的に変更する必要はありませんが、その欠点は明らかです.
  • 同じ構造のMyISAMテーブルでのみ
  • を使用できます.
  • MyISAMのすべての機能を享受できない、例えばMERGEタイプでFULLTEXT検索
  • を実行できない
  • より多くのファイル記述子
  • を使用する必要があります.
  • インデックスの読み取りが遅い
  • このとき、MySQL 5.1に追加されたパーティション機能のメリットも明らかになりました.
  • は、単一のディスクまたはファイルシステムパーティションよりも多くのデータを格納することができる
  • .
  • は、不要または古いデータ
  • を簡単に削除できます.
  • いくつかのクエリは、
  • を極めて最適化することができます.
  • SUM()/COUNT()などの集約関数に関しては、
  • を並列に行うことができる.
  • IOスループットより大きい
  • パーティションを使用すると、任意のサイズのルールに設定でき、ファイルシステムにわたって単一のテーブルの複数の部分を割り当てることができます.実際には、テーブルの異なる部分は、異なる場所で個別のテーブルとして格納される.
    パーティションに注意すべき事項:
    1、パーティションを作成する場合、プライマリ・キーを定義しないか、パーティション・フィールドをプライマリ・キーに追加します.
    2、パーティションフィールドはNULLではありません.そうしないと、どのようにパーティション範囲を確定しますか.だから、できるだけNOT NULL
    二、パーティションのタイプ
  • RANGEパーティション:指定された連続区間に属する列値に基づいて、複数行がパーティションに割り当てられる.
  • LISTパーティション:RANGEによるパーティションと同様に、LISTパーティションは、カラム値に基づいて離散値セットの値を一致させることによって選択される.
  • HASHパーティション:テーブルに挿入する行の列値を使用して計算される、ユーザー定義式の戻り値に基づいて選択されるパーティション.この関数は、MySQLで有効な非負の整数値を生成する任意の式をパッケージ>含むことができます.
  • KEYパーティション:HASHによるパーティションと同様に、KEYパーティションは1つ以上のカラムの計算のみをサポートし、MySQLサーバは独自のハッシュ関数を提供します.>整数値を含む列または複数の列が必要です.

  • SHOW VARIABLESコマンドを使用して、MySQLがパーティションをサポートしているかどうかを確認できます.たとえば、次のようにします.
    mysql> SHOW VARIABLES LIKE '%partition%';
     
      
    +-----------------------+-------+
    | Variable_name         | Value |
    +-----------------------+-------+
    | have_partition_engine | YES   |
    +-----------------------+-------+
    1 row in set (0.00 sec)
     
    1 。range   

     create table t_range( 
      id int(11), 
      money int(11) unsigned not null, 
      date datetime 
      )partition by range(year(date))( 
      partition p2007 values less than (2008), 
      partition p2008 values less than (2009), 
      partition p2009 values less than (2010) 
      partition p2010 values less than maxvalue 
      );
    2.listパーティション
    create table t_list(    a int(11),    b int(11)    )(partition by list (b)    partition p0 values in (1,3,5,7,9),    partition p1 values in (2,4,6,8,0)    ); innodbおよびmyisamエンジンでは、1つの文が複数のレコードを挿入する場合、中間に値が挿入できない場合、innodbはすべてロールバックされ、myisamはエラー値の前のデータをテーブルに挿入できます.
    innodbおよびmyisamエンジンでは、1つの文が複数のレコードを挿入する場合、中間に値が挿入できない場合、innodbはすべてロールバックされ、myisamはエラー値の前のデータをテーブルに挿入できます.
    3.hashパーティション
    hashパーティションの目的は、予め定義された各パーティションにデータを均一に分布させ、各パーティションのデータ量がほぼ一致することを保証することである.
    create table t_hash(    a int(11),    b datetime    )partition by hash (YEAR(b)    partitions 4;
    hashのパーティション関数ページには、整数値を返す必要があります.partitions句の値は非負の整数で、partitions句を付けない場合、デフォルトはパーティション数が1です.
    4.keyパーティション
    keyパーティションはhashパーティションと似ていますが、hashパーティションはユーザー定義関数でパーティション化され、keyパーティションはmysqlデータベースから提供される関数でパーティション化され、NDB clusterはMD 5関数でパーティション化され、他のストレージエンジンmysqlには内部のhash関数が使用され、これらの関数はpassword()のようなアルゴリズムに基づいています.
    create table t_key(    a int(11),    b datetime)    partition by key (b)    partitions 4;
    5.columnsパーティション
    上のRANGE、LIST、HASH、KEYの4つのパーティションでは、パーティションの条件は整形でなければならず、整形でなければ関数で整形に変換する必要がある.
    mysql-5.5はCOLUMNSパーティションをサポートし始め、RANGEとLISTパーティションの進化と見なすことができ、COLUMNSパーティションは直接非整形データを使用してパーティション化することができる.COLUMNSパーティションでは、次のデータ型がサポートされています.
    INT SMALLINT TINYINT BIGINTのようなすべての整形.FLOATとDECIMALはサポートされていません.
    DATEやDATETIMEなどの日付タイプ.残りの日付タイプはサポートされていません.
    CHAR、VARCHAR、BINARY、VARBIINARYなどの文字列タイプ.BLOBとTEXTタイプはサポートされていません.
    COLUMNSは、複数のカラムを使用してパーティション化できます.
    新規パーティション
    mysql> ALTER TABLE sale_data
        ->   ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));
    Query OK, 0 rows affected (0.36 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    パーティションの削除
    --パーティションが削除されると、そのパーティション内のすべてのデータも削除されます.
    mysql> ALTER TABLE sale_data DROP PARTITION p201010;
    Query OK, 0 rows affected (0.22 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    パーティションのマージ
    以下のSQLは、p 2010-01-p 2010-09を3つのパーティションp 2010 Q 1-p 2010 Q 3に統合する
    mysql> ALTER TABLE sale_data
        ->   REORGANIZE PARTITION p201001,p201002,p201003,
        ->                        p201004,p201005,p201006,
        ->                        p201007,p201008,p201009 INTO
        -> (
        ->   PARTITION p2010Q1 VALUES LESS THAN (201004),
        ->   PARTITION p2010Q2 VALUES LESS THAN (201007),
        ->   PARTITION p2010Q3 VALUES LESS THAN (201010)
        -> );
    Query OK, 0 rows affected (1.14 sec)
    Records: 0  Duplicates: 0  Warnings: 0