MySQLパーティション表


MySQLパーティションは、1つのテーブルを複数のより小さいテーブルに分解することです.論理的には、1つのテーブルまたは1つのインデックスしかありませんが、物理的には、このテーブルまたはインデックスは複数の物理パーティションから構成される場合があります.各パーティションは物理的に独立しています.MySQLデータベースパーティションタイプ:
  • Rangeパーティション:行データは、指定された連続区間に属する列値に基づいてパーティションに格納される.
  • Listパーティション:Rangeパーティションと似ていますが、Listパーティションは離散的な値に向いています.
  • Hashパーティション:ユーザー定義式の戻り値に基づいてパーティション化され、戻り値は負数にできません.
  • Keyパーティション:MySQLデータベースから提供されるハッシュ関数に従ってパーティション化されます.
  • Columnsパーティション:RangeパーティションとListパーティションの拡張で、非整数のパーティション条件をサポートします.
  • サブパーティション(複合パーティション):MySQLデータベースは、RangeとListのパーティション上でHashまたはKeyのサブパーティションを再実行できます.
  • , , 。
    1.Rangeパーティション
    使用例:
    create table t_range(
    id int) engine=innodb
    partition by range(id) (
    partition p0 values less than (10),
    partition p1 values less than (20),
    partition p2 values less than maxvalue);

     上記の例は、id<10の場合、p 0パーティションにデータが挿入されるid列の区間パーティションテーブルが作成されたことを示しています.10<=id<20の場合、データはp 0パーティションに挿入され、id>=20の場合、データはp 2パーティションに挿入される.maxvalueは正無限大を表す.パーティション表は、次のようにディスク上に各パーティションのファイルを作成します.
    # ls -lh t_range*
    -rw-r----- 1 mysql mysql 8.4K 8   17 19:25 t_range.frm
    -rw-r----- 1 mysql mysql  96K 8   17 19:25 t_range#P#p0.ibd
    -rw-r----- 1 mysql mysql  96K 8   17 19:25 t_range#P#p1.ibd
    -rw-r----- 1 mysql mysql  96K 8   17 19:25 t_range#P#p2.ibd

    いくつかのデータを挿入し、各パーティションでのデータの分散を確認します.
    mysql> insert into t_range values (1), (2), (10), (15), (16), (20), (22), (24), (25);
    Query OK, 9 rows affected (0.10 sec)
    Records: 9  Duplicates: 0  Warnings: 0
    
    mysql> select * from information_schema.partitions where table_schema=database() and table_name='t_range'\G
    *************************** 1. row ***************************
                    TABLE_CATALOG: def
                     TABLE_SCHEMA: mytest
                       TABLE_NAME: t_range
                   PARTITION_NAME: p0
                SUBPARTITION_NAME: NULL
       PARTITION_ORDINAL_POSITION: 1
    SUBPARTITION_ORDINAL_POSITION: NULL
                 PARTITION_METHOD: RANGE
              SUBPARTITION_METHOD: NULL
             PARTITION_EXPRESSION: id
          SUBPARTITION_EXPRESSION: NULL
            PARTITION_DESCRIPTION: 10
                       TABLE_ROWS: 2
                   AVG_ROW_LENGTH: 8192
                      DATA_LENGTH: 16384
                  MAX_DATA_LENGTH: NULL
                     INDEX_LENGTH: 0
                        DATA_FREE: 0
                      CREATE_TIME: 2020-08-17 19:25:02
                      UPDATE_TIME: 2020-08-17 19:40:16
                       CHECK_TIME: NULL
                         CHECKSUM: NULL
                PARTITION_COMMENT: 
                        NODEGROUP: default
                  TABLESPACE_NAME: NULL
    *************************** 2. row ***************************
                    TABLE_CATALOG: def
                     TABLE_SCHEMA: mytest
                       TABLE_NAME: t_range
                   PARTITION_NAME: p1
                SUBPARTITION_NAME: NULL
       PARTITION_ORDINAL_POSITION: 2
    SUBPARTITION_ORDINAL_POSITION: NULL
                 PARTITION_METHOD: RANGE
              SUBPARTITION_METHOD: NULL
             PARTITION_EXPRESSION: id
          SUBPARTITION_EXPRESSION: NULL
            PARTITION_DESCRIPTION: 20
                       TABLE_ROWS: 3
                   AVG_ROW_LENGTH: 5461
                      DATA_LENGTH: 16384
                  MAX_DATA_LENGTH: NULL
                     INDEX_LENGTH: 0
                        DATA_FREE: 0
                      CREATE_TIME: 2020-08-17 19:25:02
                      UPDATE_TIME: 2020-08-17 19:40:16
                       CHECK_TIME: NULL
                         CHECKSUM: NULL
                PARTITION_COMMENT: 
                        NODEGROUP: default
                  TABLESPACE_NAME: NULL
    *************************** 3. row ***************************
                    TABLE_CATALOG: def
                     TABLE_SCHEMA: mytest
                       TABLE_NAME: t_range
                   PARTITION_NAME: p2
                SUBPARTITION_NAME: NULL
       PARTITION_ORDINAL_POSITION: 3
    SUBPARTITION_ORDINAL_POSITION: NULL
                 PARTITION_METHOD: RANGE
              SUBPARTITION_METHOD: NULL
             PARTITION_EXPRESSION: id
          SUBPARTITION_EXPRESSION: NULL
            PARTITION_DESCRIPTION: MAXVALUE
                       TABLE_ROWS: 4
                   AVG_ROW_LENGTH: 4096
                      DATA_LENGTH: 16384
                  MAX_DATA_LENGTH: NULL
                     INDEX_LENGTH: 0
                        DATA_FREE: 0
                      CREATE_TIME: 2020-08-17 19:25:02
                      UPDATE_TIME: 2020-08-17 19:40:16
                       CHECK_TIME: NULL
                         CHECKSUM: NULL
                PARTITION_COMMENT: 
                        NODEGROUP: default
                  TABLESPACE_NAME: NULL
    3 rows in set (0.00 sec)

    PARTITION_METHODはパーティションタイプを表し、TABLE_ROWS列はパーティションに記録された数を示し,p 0パーティションには2つの記録,p 1パーティションには3つの記録,p 2パーティションには4つの記録が見られる.
    2.Listパーティション
    ListパーティションはRangeパーティションと似ていますが、パーティション列は離散しています.使用法は次のとおりです.
    create table t_list (
    a int,
    b int) engine=innodb
    partition by list(b)(
    partition p0 values in (1,3,5,7,9),
    partition p1 values in (0,2,4,6,8));

    リストパーティションテーブルを作成するには、同じ値を2回も表示できません.そうしないと、ERROR 1495 (HY000): Multiple definition of same constant in list partitioningとエラーが発生します.
    3.Hashパーティション
     Hashパーティションの目的は、予め定義された各パーティションにデータを均一に分布させ、各パーティションのデータ数がほぼ同じであることを保証することである.RangeパーティションとListパーティションでは、指定されたカラム値またはカラム値のセットがどのパーティションに保存されるべきかを明確に指定する必要があります.Hashパーティションでは、MySQLが自動的にこれらの作業を完了します.ハッシュされるカラム値に基づいてカラム値または式を指定し、パーティション化されるテーブルが分割されるパーティションの数を指定するだけです.Hashパーティション表はYEAR(b)でhashを行い,パーティションデータ量は4である.
    create table t_hash (
    a int,
    b datetime) engine=innodb
    partition by hash (YEAR(b))
    partitions 4;

    MySQLはLinear Hashというパーティションもサポートしています.Hashパーティションと同じように、キーワードHashをLinear Hashに変更するだけです.Linear Hashパーティションはhash関数を作るためにより複雑なアルゴリズムを用いた.Linear Hashパーティションの利点は、パーティションの増加、削除、統合、分割効率が高く、データ量の大きいテーブルの処理に有利であることである.欠点は、データの分布が不均衡であることです.
    4.Keyパーティション
     KeyパーティションはHashパーティションと似ていますが、Hashパーティションはユーザーが指定した関数を使用してパーティション化され、Keyパーティションは関数を明確に指定する必要がなく、SQL Myデータベースが提供する関数を自動的に使用してパーティション化されます.KeyパーティションはキーワードLinearも使用できます.使用法は次のとおりです.
    create table t_key (
    a int,
    b datetime) engine=innodb
    partition by key (b)
    partitions 4;

    5.Columnsパーティション
      Range,List,Hash,Keyの4つのパーティションでは,パーティションの条件は整数でなければならず,整数でなければYear()やMonth()などの関数で整数に変換する必要がある.Columnsパーティションは、非整数のデータを直接使用してパーティション化することができ、パーティションはタイプによって直接比較され、整数に変換する必要はありません.Range Columnsパーティションは、複数のカラムの値をパーティション化することもできます.Columnsパーティションのサポート:すべての整数、日付タイプ(Date、Datetime)、文字列タイプ(Blob、Textはサポートされていません).使用法は次のとおりです.
    create table t_columus_range(
    a int,
    b datetime) engine=innodb
    partition by range columns (b) (
    partition p0 values less than ('2019-01-01'),
    partition p1 values less than ('2020-01-01'));
    
    #          
    create table t_range_columns_mult (
    a int,
    b int,
    c char(3),
    d int) engine=innodb
    partition by range columns (a,b,c)(
    partition p0 values less than (5, 10, 'sdd'),
    partition p1 values less than (10, 20, 'xxx'),
    partition p2 values less than (maxvalue, maxvalue, maxvalue));

    6.サブパーティション
    サブパーティションは、パーティションに基づいてパーティション化され、複合パーティションとも呼ばれる.MySQLでは、RangeとListのパーティションでHashまたはKeyのサブパーティションを再実行できます.使用法は次のとおりです.
    #                  2,           。
    create table t_sub (
    a int,
    b date) engine=innodb
    partition by range(year(b))
    subpartition by hash(to_days(b))
    subpartitions 2 (
    partition p0 values less than (1990),
    partition p1 values less than (2000),
    partition p2 values less than maxvalue);
    
    #         
    ls -lh t_sub*
    -rw-r----- 1 mysql mysql 8.4K 8   18 11:46 t_sub.frm
    -rw-r----- 1 mysql mysql  96K 8   18 11:46 t_sub#P#p0#SP#p0sp0.ibd
    -rw-r----- 1 mysql mysql  96K 8   18 11:46 t_sub#P#p0#SP#p0sp1.ibd
    -rw-r----- 1 mysql mysql  96K 8   18 11:46 t_sub#P#p1#SP#p1sp0.ibd
    -rw-r----- 1 mysql mysql  96K 8   18 11:46 t_sub#P#p1#SP#p1sp1.ibd
    -rw-r----- 1 mysql mysql  96K 8   18 11:46 t_sub#P#p2#SP#p2sp0.ibd
    -rw-r----- 1 mysql mysql  96K 8   18 11:46 t_sub#P#p2#SP#p2sp1.ibd
    
    #                
    create table t_sub_named (
    a int, 
    b date) engine = innodb
    partition by range(year(b))
    subpartition by hash(to_days(b))(
    partition p0 values less than (1990) (
    subpartition s0,
    subpartition s1),
    partition p1 values less than (2000) (
    subpartition s2,
    subpartition s3),
    partition p2 values less than maxvalue(
    subpartition s4,
    subpartition s5));

    サブパーティションの作成には、次のいくつかの問題に注意する必要があります.
  • 各パーティションのサブパーティションの数は同じでなければなりません.
  • パーティションテーブルの任意のパーティションでsubpartitionを使用して任意のサブパーティションを明確に定義する場合は、すべてのサブパーティションを定義する必要があります.
  • では、subpartitionsを使用してサブパーティションの数のみを指定できます.MySQLでは、サブパーティションごとに名前が自動的に割り当てられます.subpartitionが使用されている場合、各subpartition文にはサブパーティションの名前が含まれ、各サブパーティションの名前は一意でなければなりません.

  • 7.パーティション内のNULL値
    MySQLでは、NULL値をパーティション化でき、NULL値がNULL以外の値よりも小さいとみなされます.
  • Rangeパーティションの場合、NULL値が一番左のパーティションに挿入されます.
  • Listパーティションについては、NULL値がどのパーティションに入るかを示す必要があります.
  • HashパーティションおよびKeyパーティションの場合、どのパーティション関数もNULL値を含むレコードを0に戻します.