MySQLパーティション表
MySQLパーティションは、1つのテーブルを複数のより小さいテーブルに分解することです.論理的には、1つのテーブルまたは1つのインデックスしかありませんが、物理的には、このテーブルまたはインデックスは複数の物理パーティションから構成される場合があります.各パーティションは物理的に独立しています.MySQLデータベースパーティションタイプ: Rangeパーティション:行データは、指定された連続区間に属する列値に基づいてパーティションに格納される. Listパーティション:Rangeパーティションと似ていますが、Listパーティションは離散的な値に向いています. Hashパーティション:ユーザー定義式の戻り値に基づいてパーティション化され、戻り値は負数にできません. Keyパーティション:MySQLデータベースから提供されるハッシュ関数に従ってパーティション化されます. Columnsパーティション:RangeパーティションとListパーティションの拡張で、非整数のパーティション条件をサポートします. サブパーティション(複合パーティション):MySQLデータベースは、RangeとListのパーティション上でHashまたはKeyのサブパーティションを再実行できます.
1.Rangeパーティション
使用例:
上記の例は、id<10の場合、p 0パーティションにデータが挿入されるid列の区間パーティションテーブルが作成されたことを示しています.10<=id<20の場合、データはp 0パーティションに挿入され、id>=20の場合、データはp 2パーティションに挿入される.
いくつかのデータを挿入し、各パーティションでのデータの分散を確認します.
PARTITION_METHODはパーティションタイプを表し、TABLE_ROWS列はパーティションに記録された数を示し,p 0パーティションには2つの記録,p 1パーティションには3つの記録,p 2パーティションには4つの記録が見られる.
2.Listパーティション
ListパーティションはRangeパーティションと似ていますが、パーティション列は離散しています.使用法は次のとおりです.
リストパーティションテーブルを作成するには、同じ値を2回も表示できません.そうしないと、
3.Hashパーティション
Hashパーティションの目的は、予め定義された各パーティションにデータを均一に分布させ、各パーティションのデータ数がほぼ同じであることを保証することである.RangeパーティションとListパーティションでは、指定されたカラム値またはカラム値のセットがどのパーティションに保存されるべきかを明確に指定する必要があります.Hashパーティションでは、MySQLが自動的にこれらの作業を完了します.ハッシュされるカラム値に基づいてカラム値または式を指定し、パーティション化されるテーブルが分割されるパーティションの数を指定するだけです.Hashパーティション表はYEAR(b)でhashを行い,パーティションデータ量は4である.
MySQLはLinear Hashというパーティションもサポートしています.Hashパーティションと同じように、キーワードHashをLinear Hashに変更するだけです.Linear Hashパーティションはhash関数を作るためにより複雑なアルゴリズムを用いた.Linear Hashパーティションの利点は、パーティションの増加、削除、統合、分割効率が高く、データ量の大きいテーブルの処理に有利であることである.欠点は、データの分布が不均衡であることです.
4.Keyパーティション
KeyパーティションはHashパーティションと似ていますが、Hashパーティションはユーザーが指定した関数を使用してパーティション化され、Keyパーティションは関数を明確に指定する必要がなく、SQL Myデータベースが提供する関数を自動的に使用してパーティション化されます.KeyパーティションはキーワードLinearも使用できます.使用法は次のとおりです.
5.Columnsパーティション
Range,List,Hash,Keyの4つのパーティションでは,パーティションの条件は整数でなければならず,整数でなければYear()やMonth()などの関数で整数に変換する必要がある.Columnsパーティションは、非整数のデータを直接使用してパーティション化することができ、パーティションはタイプによって直接比較され、整数に変換する必要はありません.Range Columnsパーティションは、複数のカラムの値をパーティション化することもできます.Columnsパーティションのサポート:すべての整数、日付タイプ(Date、Datetime)、文字列タイプ(Blob、Textはサポートされていません).使用法は次のとおりです.
6.サブパーティション
サブパーティションは、パーティションに基づいてパーティション化され、複合パーティションとも呼ばれる.MySQLでは、RangeとListのパーティションでHashまたはKeyのサブパーティションを再実行できます.使用法は次のとおりです.
サブパーティションの作成には、次のいくつかの問題に注意する必要があります.各パーティションのサブパーティションの数は同じでなければなりません. パーティションテーブルの任意のパーティションで では、
7.パーティション内のNULL値
MySQLでは、NULL値をパーティション化でき、NULL値がNULL以外の値よりも小さいとみなされます. Rangeパーティションの場合、NULL値が一番左のパーティションに挿入されます. Listパーティションについては、NULL値がどのパーティションに入るかを示す必要があります. HashパーティションおよびKeyパーティションの場合、どのパーティション関数もNULL値を含むレコードを0に戻します.
, , 。
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以外の値よりも小さいとみなされます.