ALTER TABLE
のパーティション化関連の句は、再パーティション化、パーティションの追加、削除、マージ、および分割、パーティション化の保守の実行などのために、パーティション化されたテーブルで使用できます。
-
単に、パーティション化されたテーブルに対して
ALTER TABLE
でpartition_options
句を使用するだけで、partition_options
で定義されたパーティション化スキームに従って、そのテーブルが再パーティション化されます。この句は、常にPARTITION BY
で始まり、CREATE TABLE
のpartition_options
句に適用されるのと同じ構文およびその他のルールに従います (詳細は、セクション13.1.17「CREATE TABLE 構文」を参照してください)。また、まだパーティション化されていない既存のテーブルのパーティション化にも使用できます。たとえば、次に示すように定義された (パーティション化されていない) テーブルを考えてみます。CREATE TABLE t1 ( id INT, year_col INT );
このテーブルは、次のステートメントを使用し、
id
カラムをパーティション化キーとして使用してHASH
によって 8 つのパーティションにパーティション化できます。ALTER TABLE t1 PARTITION BY HASH(id) PARTITIONS 8;
MySQL 5.6.11 以降では、
[SUB]PARTITION BY [LINEAR] KEY
でALGORITHM
オプションがサポートされます。ALGORITHM=1
を指定すると、サーバーは、パーティション内の行の配置を計算するときに MySQL 5.1 と同じキーハッシュ関数を使用します。ALGORITHM=2
は、サーバーが、MySQL 5.5 以降で実装され、KEY
によってパーティション化された新しいテーブルに対してデフォルトで使用されるキーハッシュ関数を使用することを示します。(MySQL 5.5 以降で採用されたキーハッシュ関数によって作成されたパーティション化されたテーブルを MySQL 5.1 サーバーで使用することはできません。)このオプションを指定しない場合は、ALGORITHM=2
を使用するのと同じ効果があります。このオプションは、主に[LINEAR] KEY
によってパーティション化されたテーブルを MySQL 5.1 以降の MySQL バージョン間でアップグレードまたはダウングレードするときに使用するか、または MySQL 5.5 以降のサーバー上で、MySQL 5.1 サーバー上で使用できるKEY
またはLINEAR KEY
によってパーティション化されたテーブルを作成することを目的にしています。MySQL 5.1 で作成された、
KEY
によってパーティション化されたテーブルをアップグレードするには、最初にSHOW CREATE TABLE
を実行し、表示される正確なカラムおよびパーティションの数をメモします。次に、CREATE TABLE
ステートメントとまったく同じカラムリストおよびパーティションの数を使用してALTER TABLE
ステートメントを実行しますが、そのときPARTITION BY
キーワードの直後にALGORITHM=2
を追加します。(元のテーブル定義にLINEAR
キーワードが使用されていた場合は、そのキーワードも含めるようにしてください。)mysql クライアントでのセッションの例を次に示します。mysql> SHOW CREATE TABLE p\G *************************** 1. row *************************** Table: p Create Table: CREATE TABLE `p` ( `id` int(11) NOT NULL AUTO_INCREMENT, `cd` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!50100 PARTITION BY LINEAR KEY (id) PARTITIONS 32 */ 1 row in set (0.00 sec) mysql> ALTER TABLE p PARTITION BY LINEAR KEY ALGORITHM=2 (id) PARTITIONS 32; Query OK, 0 rows affected (5.34 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW CREATE TABLE p\G *************************** 1. row *************************** Table: p Create Table: CREATE TABLE `p` ( `id` int(11) NOT NULL AUTO_INCREMENT, `cd` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!50100 PARTITION BY LINEAR KEY (id) PARTITIONS 32 */ 1 row in set (0.00 sec)
MySQL 5.5 以降で使用されているデフォルトのキーハッシュを使用して作成されたテーブルを、MySQL 5.1 サーバーで使用できるようにダウングレードする場合も同様です。ただし、この場合は、そのテーブルのパーティションが強制的に MySQL 5.1 のキーハッシュ関数を使用して再構築されるように、
ALGORITHM=1
を使用するようにしてください。MySQL 5.5 以降ではデフォルトで使用される改善されたKEY
ハッシュ関数により、古い実装で見つかった多くの問題に対する修正が提供されるため、MySQL 5.1 サーバーとの互換性のために必要な場合を除き、これは行わないようにすることをお勧めします。注記ALTER TABLE ... PARTITION BY ALGORITHM=2 [LINEAR] KEY ...
を使用してアップグレードされたテーブルは、MySQL 5.1 サーバーでは使用できなくなります。(このようなテーブルを MySQL 5.1 サーバーでふたたび使用できるようにするには、ALTER TABLE ... PARTITION BY ALGORITHM=1 [LINEAR] KEY ...
を使用してダウングレードする必要があります。)ALTER TABLE ... PARTITION BY
ステートメントを使用して作成されたテーブルは、CREATE TABLE ... PARTITION BY
を使用して作成されたテーブルと同じルールに従う必要があります。これには、そのテーブルに含まれている可能性のあるすべての一意のキー (すべての主キーを含む) と、パーティショニング式で使用されている 1 つまたは複数のカラムの間の関係を管理するルールが含まれます。これについては、セクション19.6.1「パーティショニングキー、主キー、および一意キー」で説明されています。また、パーティションの数を指定するためのCREATE TABLE ... PARTITION BY
のルールもALTER TABLE ... PARTITION BY
に適用されます。ALTER TABLE ADD PARTITION
のpartition_definition
句は、CREATE TABLE
ステートメントの同じ名前の句と同じオプションをサポートしています。(構文と説明については、セクション13.1.17「CREATE TABLE 構文」を参照してください。)次に示すように作成されたパーティション化されたテーブルがあるとします。CREATE TABLE t1 ( id INT, year_col INT ) PARTITION BY RANGE (year_col) ( PARTITION p0 VALUES LESS THAN (1991), PARTITION p1 VALUES LESS THAN (1995), PARTITION p2 VALUES LESS THAN (1999) );
このテーブルに、
2002
より小さい値を格納するための新しいパーティションp3
を次のように追加できます。ALTER TABLE t1 ADD PARTITION (PARTITION p3 VALUES LESS THAN (2002));
DROP PARTITION
を使用すると、1 つ以上のRANGE
またはLIST
パーティションを削除できます。このステートメントをHASH
またはKEY
パーティションに使用することはできません。代わりにCOALESCE PARTITION
を使用します (下を参照してください)。partition_names
リストで名前が指定されている削除されたパーティションに格納されていたデータはすべて破棄されます。たとえば、前に定義されたテーブルt1
の場合は、p0
およびp1
という名前のパーティションを次に示すように削除できます。ALTER TABLE t1 DROP PARTITION p0, p1;
注記DROP PARTITION
は、NDB
ストレージエンジンを使用するテーブルでは機能しません。セクション19.3.1「RANGE および LIST パーティションの管理」およびセクション18.1.6「MySQL Cluster の既知の制限」を参照してください。ADD PARTITION
とDROP PARTITION
は現在、IF [NOT] EXISTS
をサポートしていません。パーティション化されたテーブルの名前変更がサポートされています。
ALTER TABLE ... REORGANIZE PARTITION
を使用して、間接的に個々のパーティションの名前を変更できます。ただし、この操作によってパーティションのデータのコピーが作成されます。MySQL 5.6 では、
TRUNCATE PARTITION
オプションを使用して、選択したパーティションの行を削除できます。このオプションは、1 つ以上のパーティション名のカンマ区切りリストを受け取ります。たとえば、次のように定義されたテーブルt1
を考えてみます。CREATE TABLE t1 ( id INT, year_col INT ) PARTITION BY RANGE (year_col) ( PARTITION p0 VALUES LESS THAN (1991), PARTITION p1 VALUES LESS THAN (1995), PARTITION p2 VALUES LESS THAN (1999), PARTITION p3 VALUES LESS THAN (2003), PARTITION p4 VALUES LESS THAN (2007) );
パーティション
p0
のすべての行を削除するには、次のステートメントを使用できます。ALTER TABLE t1 TRUNCATE PARTITION p0;
今示したステートメントには、次の
DELETE
ステートメントと同じ効果があります。DELETE FROM t1 WHERE year_col < 1991;
複数のパーティションを切り詰める場合、パーティションが連続している必要はありません。これにより、通常、
DELETE
ステートメントで実行された場合は非常に複雑なWHERE
条件が必要になる、パーティション化されたテーブルでの削除操作が大幅に簡素化される可能性があります。たとえば、次のステートメントは、パーティションp1
とp3
のすべての行を削除します。ALTER TABLE t1 TRUNCATE PARTITION p1, p3;
同等の
DELETE
ステートメントを次に示します。DELETE FROM t1 WHERE (year_col >= 1991 AND year_col < 1995) OR (year_col >= 2003 AND year_col < 2007);
パーティション名のリストの代わりに
ALL
キーワードを使用することもできます。この場合、このステートメントはテーブル内のすべてのパーティションに対して機能します。TRUNCATE PARTITION
は行を削除するだけです。そのテーブル自体や、どのパーティションの定義も変更されません。注記TRUNCATE PARTITION
は、サブパーティションでは機能しません。次のようなクエリーを使用して
INFORMATION_SCHEMA.PARTITIONS
テーブルをチェックすることにより、行が削除されたことを確認できます。SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 't1';
TRUNCATE PARTITION
は、MyISAM
、InnoDB
、またはMEMORY
ストレージエンジンを使用するパーティション化されたテーブルでのみサポートされます。また、BLACKHOLE
テーブルに対しても機能します (ただし、何の効果もありません)。ARCHIVE
テーブルではサポートされません。HASH
またはKEY
によってパーティション化されたテーブルでCOALESCE PARTITION
を使用すると、そのパーティションの数をnumber
だけ減らすことができます。次の定義を使用して、テーブルt2
を作成したとします。CREATE TABLE t2 ( name VARCHAR (30), started DATE ) PARTITION BY HASH( YEAR(started) ) PARTITIONS 6;
t2
によって使用されるパーティションの数を、次のステートメントを使用して 6 から 4 に減らすことができます。ALTER TABLE t2 COALESCE PARTITION 2;
最後の
number
個のパーティションに含まれているデータは、残りのパーティションにマージされます。この場合は、パーティション 4 と 5 が最初の 4 つのパーティション (0、1、2、および 3 の番号を持つ各パーティション) にマージされます。パーティション化されたテーブルで使用される (すべてではなく) 一部のパーティションを変更するには、
REORGANIZE PARTITION
を使用できます。このステートメントは、次のいくつかの方法で使用できます。一連のパーティションを単一パーティションにマージします。これは、
partition_names
リストにいくつかのパーティションの名前を指定し、partition_definition
に 1 つの定義を指定することによって実行できます。既存のパーティションをいくつかのパーティションに分割します。これは、
partition_names
に単一パーティションを指定し、複数のpartition_definitions
を指定することによって実行できます。VALUES LESS THAN
を使用して、定義されたパーティションのサブセットの範囲を変更するか、またはVALUES IN
を使用して、定義されたパーティションのサブセットの値リストを変更します。-
このステートメントはまた、
HASH
パーティション化を使用して自動的にパーティション化されるテーブルに対して
オプションなしで使用すると、データを強制的に再配布できます。(現在、このように自動的にパーティション化されるのはpartition_names
INTO (partition_definitions
)NDB
テーブルだけです。)これは、既存の MySQL Cluster に新しい MySQL Cluster データノードをオンラインで追加したあと、既存の MySQL Cluster テーブルデータを新しいデータノードに再配布する必要がある MySQL Cluster で役立ちます。このような場合は、ONLINE
オプションを使用してこのステートメントを呼び出すようにしてください。つまり、次に示すようにします。ALTER ONLINE TABLE table REORGANIZE PARTITION;
オンラインのテーブル再編成と同時にほかの DDL を実行することはできません。つまり、
ALTER ONLINE TABLE ... REORGANIZE PARTITION
ステートメントの実行中は、ほかの DDL ステートメントを発行できません。MySQL Cluster データノードをオンラインで追加する方法の詳細は、セクション18.5.13「MySQL Cluster データノードのオンライン追加」を参照してください。ALTER ONLINE TABLE ... REORGANIZE PARTITION
は、MAX_ROWS
オプションを使用して作成されたテーブルでは機能しません。このステートメントは、元のCREATE TABLE
ステートメントで指定された一定のMAX_ROWS
値を使用して必要なパーティションの数を決定するため、新しいパーティションが作成されないためです。テーブルの行の最大数を増やすには、ALTER ONLINE TABLE ... MAX_ROWS=
を使用できます。このあと、rows
ALTER ONLINE TABLE ... REORGANIZE PARTITION
は、この大きくなった新しい値を使用してパーティションの数を増やすことができます。これが機能するには、rows
の値を、元のCREATE TABLE
ステートメントでMAX_ROWS
に指定された値より大きくする必要があります。明示的にパーティション化されたテーブルに対して、
REORGANIZE PARTITION
を
オプションなしで使用しようとすると、REORGANIZE PARTITION without parameters can only be used on auto-partitioned tables using HASH partitioningエラーが発生します。partition_names
INTO (partition_definitions
)
注記明示的に名前が付けられていないパーティションに対して、MySQL は自動的に
p0
、p1
、p2
などのデフォルト名を付けます。同じことがサブパーティションにも当てはまります。ALTER TABLE ... REORGANIZE PARTITION
ステートメントの詳細および例については、セクション19.3.1「RANGE および LIST パーティションの管理」を参照してください。 -
MySQL 5.6 では、
ALTER TABLE ... EXCHANGE PARTITION
ステートメントを使用して、テーブルパーティションまたはサブパーティションを別のテーブルと交換できます。つまり、パーティションまたはサブパーティション内の既存の任意の行をパーティション化されていないテーブルに移動したり、パーティション化されていないテーブル内の既存の任意の行をテーブルパーティションまたはサブパーティションに移動したりできます。使用方法および例については、セクション19.3.3「パーティションとサブパーティションをテーブルと交換する」を参照してください。
-
いくつかの追加オプションによって、パーティション化されていないテーブルのために
CHECK TABLE
やREPAIR TABLE
などのステートメントによって実装されている機能 (これは、パーティション化されたテーブルでもサポートされます。詳細は、セクション13.7.2「テーブル保守ステートメント」を参照してください) に類似したパーティションの保守および修復機能が提供されます。これには、ANALYZE PARTITION
、CHECK PARTITION
、OPTIMIZE PARTITION
、REBUILD PARTITION
、およびREPAIR PARTITION
が含まれます。これらの各オプションは、1 つ以上のパーティション名から成るカンマで区切られたpartition_names
句を受け取ります。これらのパーティションは、変更されるテーブル内にすでに存在する必要があります。partition_names
の代わりにALL
キーワードを使用することもできます。その場合、このステートメントはテーブル内のすべてのパーティションに対して機能します。詳細および例については、セクション19.3.4「パーティションの保守」を参照してください。InnoDB
などの一部の MySQL ストレージエンジンは、パーティションごとの最適化をサポートしていません。このようなストレージエンジンを使用したパーティション化されたテーブルに対して、ALTER TABLE ... OPTIMIZE PARTITION
はテーブル全体を再構築します。これは既知の問題です。MySQL 5.6.9 から、このようなテーブルに対してこのステートメントを実行するとテーブル全体が再構築および分析され、該当する警告が発行されます。(Bug #11751825、Bug #42822)この問題を回避するには、代わりに、ステートメント
ALTER TABLE ... REBUILD PARTITION
およびALTER TABLE ... ANALYZE PARTITION
を使用します。ANALYZE PARTITION
、CHECK PARTITION
、OPTIMIZE PARTITION
、およびREPAIR PARTITION
オプションは、パーティション化されていないテーブルには許可されません。 REMOVE PARTITIONING
を使用すると、テーブルのパーティション化を削除でき、そのテーブルやデータはそれ以外の影響を受けません。このオプションは、カラムやインデックスの追加、削除、名前変更などのために使用されるその他のALTER TABLE
オプションと組み合わせることができます。ALTER TABLE
でENGINE
オプションを使用すると、パーティション化に影響を与えることなく、テーブルで使用されるストレージエンジンが変更されます。
MySQL 5.6.6 より前は、MyISAM
(または、テーブルレベルのロックを使用する別のストレージエンジン) を使用するパーティション化されたテーブルに対して ALTER TABLE ... EXCHANGE PARTITION
または ALTER TABLE ... TRUNCATE PARTITION
が実行されると、そのパーティション化されたテーブル全体がロックされました。MySQL 5.6.6 以降では、このような場合、実際に読み取られたパーティションのみがロックされます。これは、行レベルロックを採用している (InnoDB
などの) ストレージエンジンを使用するパーティション化されたテーブルには影響しませんでした (現在も影響しません)。セクション19.6.4「パーティショニングとロック」を参照してください。
ALTER TABLE
ステートメントには、ほかの変更指定に加えて、PARTITION BY
または REMOVE PARTITIONING
句を含めることができますが、PARTITION BY
または REMOVE PARTITIONING
句は、ほかのどの指定よりもあとの最後に指定する必要があります。
ADD PARTITION
、DROP PARTITION
、COALESCE PARTITION
、REORGANIZE PARTITION
、ANALYZE PARTITION
、CHECK PARTITION
、および REPAIR PARTITION
オプションは、個々のパーティションに対して機能するため、1 つの ALTER TABLE
内でほかの変更指定と組み合わせることはできません。詳細は、セクション13.1.7.1「ALTER TABLE パーティション操作」を参照してください。
特定の ALTER TABLE
ステートメントでは、次のいずれか 1 つのオプションの単一インスタンスのみを使用できます。PARTITION BY
、ADD PARTITION
、DROP PARTITION
、TRUNCATE PARTITION
、EXCHANGE PARTITION
、REORGANIZE PARTITION
、または COALESCE PARTITION
、ANALYZE PARTITION
、CHECK PARTITION
、OPTIMIZE PARTITION
、REBUILD PARTITION
、REMOVE PARTITIONING
。
たとえば、次の 2 つのステートメントは無効です。
ALTER TABLE t1 ANALYZE PARTITION p1, ANALYZE PARTITION p2;
ALTER TABLE t1 ANALYZE PARTITION p1, CHECK PARTITION p2;
最初のケースでは、次のように、分析される両方のパーティションを一覧表示した 1 つの ANALYZE PARTITION
オプションを含む 1 つのステートメントを使用して、テーブル t1
のパーティション p1
と p2
を同時に分析できます。
ALTER TABLE t1 ANALYZE PARTITION p1, p2;
2 番目のケースでは、同じテーブルの別のパーティションに対する ANALYZE
操作と CHECK
操作を同時に実行することはできません。代わりに、次のように、2 つの個別のステートメントを発行する必要があります。
ALTER TABLE t1 ANALYZE PARTITION p1;
ALTER TABLE t1 CHECK PARTITION p2;
ANALYZE
、CHECK
、OPTIMIZE
、REBUILD
、REPAIR
、および TRUNCATE
操作は、サブパーティションではサポートされません。