MySQLパーティションタイプ


文書ディレクトリ
  • MySQLパーティションタイプ
  • 一、RANGEパーティション
  • 1、RANGEパーティション
  • 2、RANGE COLUMNSパーティション
  • 二、LISTパーティション
  • 1、LISTパーティション
  • 2、LIST COLUMNSパーティション
  • 三、HASHパーティション
  • 1、通常HASH
  • 2、リニアHASHパーティション(LINEAR HASHパーティション)
  • 四、KEYパーティション
  • 1、KEYパーティション
  • 2、LINEAR KEYパーティション
  • 五、サブパーティション
  • 六、MySQLパーティション処理NULL価値方式
  • MySQLパーティションタイプ
    RANGEパーティション:所定の連続区間範囲に基づいて、データを異なるパーティションに割り当てる.
    LISTパーティション:列挙した値リストに基づいてパーティション化する.
    COLUMNSパーティション:RANGEとLISTと同様に、パーティションキーは複数列でも非整数でもよいことを区別します.
    HASHパーティション:所与のパーティション数に基づいて、データを型取りして異なるパーティションに割り当てる.
    KEYパーティション:HASHパーティションと似ていますが、MySQLが提供するハッシュ関数を使用します.
    サブパーティション:複合パーティションまたは組合せパーティションとも呼ばれ、プライマリパーティションの下でさらにパーティションを作成し、データを再分割します.
    注意:1、RANGEパーティション、LISTパーティション、HASHパーティションは、パーティションキーがINTタイプであるか、式によってINTタイプを返す必要があります.ただし、KEYおよびCOLUMNSパーティションでは、他のタイプのカラム(BLOBまたはTEXTカラムタイプを除く)をパーティションキーとして使用できます.
    2、どのパーティションタイプであれ、パーティション表にプライマリ・キー/ユニーク・キーがないか、パーティション表のプライマリ・キー/ユニーク・キーがパーティション・キーにあるか
    3、MySQLテーブルのカラム名、別名、パーティション名は大文字と小文字を区別しません.
    一、RANGEパーティション
    1、RANGEパーティション
    RANGEパーティションのテーブルに従って値範囲でデータをパーティション化し、区間が連続して重複しないようにVALES LESS THANオペレータを使用してパーティション定義を行います.パーティションキーとして式をサポートします.
    #     
    create table emp(
    	id INT NOT NULL,
    	ename VARCHAR(30),
    	hired DATE NOT NULL DEFAULT '1970-01-01',
    	separated DATE NOT NULL DEFAULT '9999-12-31',
    	job VARCHAR(30) NOT NULL,
    	store_id INT NOT NULL
    )
    PARTITION BY RANGE (store_id)(
    	PARTITION p0 VALUES LESS THAN(10),
    	PARTITION p1 VALUES LESS THAN(20),
    	PARTITION p2 VALUES LESS THAN(30)
    );
    
    #     ,MAXVALUE            
    alter table emp add partition(partition p3 VALUES LESS THAN MAXVALUE);
    
    #     
    alter table emp drop partition p0;
    

    注意:RANGEパーティションでは、パーティションキーがNULL値の場合、最小値として扱われます.
    2、RANGE COLUMNSパーティション
    RANGE COLUMNSパーティションは、整数、日時、文字列データ型をサポートします.
    整数タイプ:tinyint、smallint、mediumint、int、bigintをサポートします.その他の数値タイプはサポートされていません.
    日付時間タイプ:dateとdatetimeをサポートします.
    文字タイプ:char、varchar、binary、varbinaryをサポートします.
    注:COLUMNSパーティションでは、パーティションとして1つ以上のフィールド(すなわち、複数列のパーティション)がサポートされていますが、パーティションキーとして式はサポートされていません.
    #   RANGE COLUMNS   
    create table emp_date(
    	id INT NOT NULL,
    	ename VARCHAR(30),
    	hired DATE NOT NULL DEFAULT '1970-01-01',
    	separated DATE NOT NULL DEFAULT '9999-12-31',
    	job VARCHAR(30) NOT NULL,
    	store_id INT NOT NULL
    )
    PARTITION BY RANGE COLUMNS(separated)(
    	PARTITION p0 VALUES LESS THAN('1970-01-01'),
    	PARTITION p1 VALUES LESS THAN('2000-01-01'),
    	PARTITION p2 VALUES LESS THAN('2010-01-01')
    );
    
    
    #   RANGE COLUMNS     
    create table rcol(
    	a int,
    	b int
    )partition by range columns(a,b)(
    	partition p01 values less than(0,10),
    	partition p02 values less than(10,10),
    	partition p03 values less than(10,maxvalue),
    	partition p04 values less than(maxvalue,maxvalue)
    );
    

    RANGE COLUMNSマルチカラムパーティションキーの比較はメタグループの比較に基づいている.例えばa=1,b=10と書くのは、メタグループ(1,10)
    mysql> select (1,10) insert into rcol(a,b) values(1,10);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select partition_name,partition_expression,partition_description,table_rows from information_schema.partitions where table_schema=schema() and table_name='rcol';
    +----------------+----------------------+-----------------------+------------+
    | partition_name | partition_expression | partition_description | table_rows |
    +----------------+----------------------+-----------------------+------------+
    | p01            | `a`,`b`              | 0,10                  |          0 |
    | p02            | `a`,`b`              | 10,10                 |          1 |
    | p03            | `a`,`b`              | 10,20                 |          0 |
    | p04            | `a`,`b`              | 10,MAXVALUE           |          0 |
    | p05            | `a`,`b`              | MAXVALUE,MAXVALUE     |          0 |
    +----------------+----------------------+-----------------------+------------+
    5 rows in set (0.00 sec)
    
    

    二、LISTパーティション
    1、LISTパーティション
    LISTパーティションは、データベースの特定の値がどのパーティションに属するかを示す離散的な値リストを作成し、リストを列挙する価値のある集合である.パーティションキーとして式をサポートします.
    #   LIST   
    create table expenses(
    	expense_date date not null,
    	category int,
    	amount decimal(10,3)
    )partition by list(category)(
    	partition p0 values in(1,3),
    	partition p1 values in(2,5),
    	partition p2 values in(6,7),
    	partition p3 values in(4,10)
    );
    

    2、LIST COLUMNSパーティション
    LIST COLUMNSパーティションは整数、日付時間、文字列データ型をサポートする
    整数タイプ:tinyint、smallint、mediumint、int、bigintをサポートします.その他の数値タイプはサポートされていません.
    日付時間タイプ:dateとdatetimeをサポートします.
    文字タイプ:char、varchar、binary、varbinaryをサポートします.
    注:COLUMNSパーティションでは、パーティションとして1つ以上のフィールド(すなわち、複数列のパーティション)がサポートされていますが、パーティションキーとして式はサポートされていません.
    create table expenses_col(
    	expense_date date not null,
    	category varchar(30),
    	amount decimal(10,3)
    )partition by list columns(category)(
    	partition p0 values in('li','mei'),
    	partition p1 values in('lili','gu'),
    	partition p2 values in('tiger','hope'),
    	partition p3 values in('nan','cili')
    );
    

    三、HASHパーティション
    HASHパーティションは主にホットスポット読み取りを分散させ,予め定められた個数のパーティションにおいてデータが可能な限り平均的に分布することを確保するために用いられる.
    MySQLは2種類のHASHパーティションをサポートする:通常HASHと線形HASHパーティション
    1、通常HASH
    型取りアルゴリズムを使用します.利点:モデリングにより、データをできるだけ平均的に各パーティションに分散させ、各パーティション管理のデータを削減し、クエリー効率を向上させる.欠点:パーティションを追加またはマージする必要がある場合、パーティション内のデータの大部分は計算によって再パーティション化する必要があります.
    #     HASH   
    create table emp_hash(
    	id INT NOT NULL,
    	ename VARCHAR(30),
    	hired DATE NOT NULL DEFAULT '1970-01-01',
    	separated DATE NOT NULL DEFAULT '9999-12-31',
    	job VARCHAR(30) NOT NULL,
    	store_id INT NOT NULL
    )PARTITION BY HASH (store_id) PARTITIONS 4;
    
    #    ,   MOD(134,4)=2,   store_id= 134       
    insert into emp_hash values(1,'lili','2010-10-01','9999-01-01','clerk','134');
    
    #        
    mysql> select partition_name,partition_expression,partition_description,table_rows from information_schema.partitions where table_schema=schema() and table_name='emp_hash';
    +----------------+----------------------+-----------------------+------------+
    | partition_name | partition_expression | partition_description | table_rows |
    +----------------+----------------------+-----------------------+------------+
    | p0             | store_id             | NULL                  |          0 |
    | p1             | store_id             | NULL                  |          0 |
    | p2             | store_id             | NULL                  |          1 |
    | p3             | store_id             | NULL                  |          0 |
    +----------------+----------------------+-----------------------+------------+
    4 rows in set (0.00 sec)
    
    

    2、線形HASHパーティション(LINEAR HASHパーティション)
    線形の2のべき乗の演算アルゴリズムを使用します.利点:MySQLは、パーティションのメンテナンス(パーティションの追加、削除、マージ、分割)時により迅速に処理できます.欠点:各パーティション間のデータの分布があまり均衡していない.
    #   LINEAR HASH   
    create table emp_linear(
    	id INT NOT NULL,
    	ename VARCHAR(30),
    	hired DATE NOT NULL DEFAULT '1970-01-01',
    	separated DATE NOT NULL DEFAULT '9999-12-31',
    	job VARCHAR(30) NOT NULL,
    	store_id INT NOT NULL
    )PARTITION BY LINEAR HASH (store_id) PARTITIONS 6;
    
    #     134,   V=POWER(2,CEILING(LOG(2, 6)))=8,N=mod(134,8)=6,    N=6>=6,  N=mod(N,(V/2))=mod(6,4)=2,      p2
    mysql> insert into emp_linear values(1,'lili','2010-10-01','9999-01-01','clerk','134');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select partition_name,partition_expression,partition_description,table_rows from information_schema.partitions where table_schema=schema() and table_name='emp_linear';
    +----------------+----------------------+-----------------------+------------+
    | partition_name | partition_expression | partition_description | table_rows |
    +----------------+----------------------+-----------------------+------------+
    | p0             | store_id             | NULL                  |          0 |
    | p1             | store_id             | NULL                  |          0 |
    | p2             | store_id             | NULL                  |          1 |
    | p3             | store_id             | NULL                  |          0 |
    | p4             | store_id             | NULL                  |          0 |
    | p5             | store_id             | NULL                  |          0 |
    +----------------+----------------------+-----------------------+------------+
    6 rows in set (0.00 sec)
    
    #     133,   V=POWER(2,CEILING(LOG(2, 6)))=8,N=mod(134,8)=5,    N=5<6,      p5
    mysql> insert into emp_linear values(1,'lili','2010-10-01','9999-01-01','clerk','133');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select partition_name,partition_expression,partition_description,table_rows from information_schema.partitions where table_schema=schema() and table_name='emp_linear';
    +----------------+----------------------+-----------------------+------------+
    | partition_name | partition_expression | partition_description | table_rows |
    +----------------+----------------------+-----------------------+------------+
    | p0             | store_id             | NULL                  |          0 |
    | p1             | store_id             | NULL                  |          0 |
    | p2             | store_id             | NULL                  |          1 |
    | p3             | store_id             | NULL                  |          0 |
    | p4             | store_id             | NULL                  |          0 |
    | p5             | store_id             | NULL                  |          1 |
    +----------------+----------------------+-----------------------+------------+
    6 rows in set (0.00 sec)
    
    

    けいさんプロセス
    #LOG()   NUM 2     ,CEILING()     ,POWER()  2    
    #values       ,num    
    V = POWER(2, CEILING(LOG(2, num)))
    #N=values&(V-1)
    N=mod(values,V)
    if N >= num
    	#N = N&(CEIL(V/2)-1)
    	N=mod(N,V/2)
    

    四、KEYパーティション
    1、KEYパーティション
    KEYパーティションではユーザー定義の式は使用できません.MySQLサーバーが提供するHASH関数を使用する必要があります.BLOBとText以外のタイプの列をパーティションキーとして使用することをサポートします.0つ以上のフィールド名をパーティションキーとして使用することをサポートします.
    #   KEY   
    create table emp_key(
    	id INT NOT NULL,
    	ename VARCHAR(30),
    	hired DATE NOT NULL DEFAULT '1970-01-01',
    	separated DATE NOT NULL DEFAULT '9999-12-31',
    	job VARCHAR(30) NOT NULL,
    	store_id INT NOT NULL
    )PARTITION BY KEY (store_id) PARTITIONS 4;
    
    #        ,               
    create table emp_key_pri(
    	id INT NOT NULL,
    	ename VARCHAR(30),
    	hired DATE NOT NULL DEFAULT '1970-01-01',
    	separated DATE NOT NULL DEFAULT '9999-12-31',
    	job VARCHAR(30) NOT NULL,
    	store_id INT NOT NULL,
    	primary key(id)
    )PARTITION BY KEY () PARTITIONS 4;
    
    #        ,        ,            。
    create table emp_key_uni(
    	id INT NOT NULL,
    	ename VARCHAR(30),
    	hired DATE NOT NULL DEFAULT '1970-01-01',
    	separated DATE NOT NULL DEFAULT '9999-12-31',
    	job VARCHAR(30) NOT NULL,
    	store_id INT NOT NULL,
    	unique key(id)
    )PARTITION BY KEY () PARTITIONS 4;
    

    注:1)パーティションキーを指定しない場合は、デフォルトではまずプライマリ・キーをパーティション・キーとして使用することを選択します.パーティションキーを指定せず、プライマリキーがない場合は、パーティションキーとして空でないユニークキーを選択します.
    2)プライマリ・キーがなく、ユニーク・キーがない場合は、パーティション・キーを指定する必要があります.パーティションキーとしての一意のキーは空でない必要があります.
    2、LINEAR KEYパーティション
    パーティションの番号は2のべき乗アルゴリズムで得られる.
    #   LINEAR KEY   
    create table emp_key_lin(
    	id INT NOT NULL,
    	ename VARCHAR(30),
    	hired DATE NOT NULL DEFAULT '1970-01-01',
    	separated DATE NOT NULL DEFAULT '9999-12-31',
    	job VARCHAR(30) NOT NULL,
    	store_id INT NOT NULL
    )PARTITION BY LINEAR KEY (store_id) PARTITIONS 4;
    

    五、サブパーティション
    サブパーティション(Subpartitioning)は、各パーティションに対するパーティションテーブルの再分割であり、複合パーティション(Composite Partitioning)と呼ばれ、MySQL 5.7はRANGEまたはLISTパーティションを通過したテーブルのサブパーティション化をサポートする.サブパーティションはHASHパーティションもKEYパーティションも使用できます.
    #     
    create table emp_range_sub(
    	id INT NOT NULL,
    	hired date
    )PARTITION BY RANGE (year(hired))
    SUBPARTITION BY HASH(to_days(hired))
    SUBPARTITIONS 2
    (
    PARTITION p0 VALUES LESS THAN(1990),
    PARTITION p1 VALUES LESS THAN(2000),
    PARTITION p2 VALUES LESS THAN MAXVALUE
    );
    
    # 
    create table emp_range_sub1(
    	id INT NOT NULL,
    	hired date
    )PARTITION BY RANGE (year(hired))
    SUBPARTITION BY HASH(to_days(hired))
    (
    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
    ));
    
    

    注:1、各パーティションには同じ数のサブパーティションが必要です.
    2、指定されたサブパーティションを表示する場合は、各パーティションに指定が表示されます.
    3、サブパーティションの名前はテーブル全体で一意です.
    六、MySQLパーティション処理NULL価値方式
    1.RANGEパーティションでは、NULL値が最小値として扱われます.
    2、LISTパーティションでは、NULL値が列挙リストに表示されなければならない.そうしないと受け入れられない.
    3、HASH/KEYパーティションでは、NULL値はゼロ値として扱われます.