DDL 操作のオンラインサポートの詳細、構文例および使用上のノートは、このセクションの次のトピックで説明します。
次のテーブルに、インデックス操作のオンライン DDL サポートの概要を示します。 アスタリスクは、追加情報、例外または依存関係を示します。 詳細は、構文および使用上のノートを参照してください。
表 15.16 インデックス操作のオンライン DDL サポート
操作 | インスタント | インプレース | テーブルの再構築 | 同時 DML の許可 | メタデータの変更のみ |
---|---|---|---|---|---|
セカンダリインデックスの作成または追加 | いいえ | はい | いいえ | はい | いいえ |
インデックスの削除 | いいえ | はい | いいえ | はい | はい |
インデックスの名前変更 | いいえ | はい | いいえ | はい | はい |
FULLTEXT インデックスの追加 |
いいえ | はい* | いいえ* | いいえ | いいえ |
SPATIAL インデックスの追加 |
いいえ | はい | いいえ | いいえ | いいえ |
インデックスタイプの変更 | はい | はい | いいえ | はい | はい |
構文および使用上のノート
-
セカンダリインデックスの作成または追加
CREATE INDEX name ON table (col_list);
ALTER TABLE tbl_name ADD INDEX name (col_list);
このテーブルは、インデックスの作成中も読取りおよび書込み操作に使用できます。
CREATE INDEX
ステートメントは、テーブルにアクセスしているすべてのトランザクションが完了した後にのみ終了するため、インデックスの初期状態にはテーブルの最新の内容が反映されます。セカンダリインデックスを追加するためのオンライン DDL サポートとは、通常、セカンダリインデックスのないテーブルを作成してからデータのロード後にセカンダリインデックスを追加することで、テーブルおよび関連するインデックスの作成およびロードのプロセス全体を高速化できることを意味します。
新しく作成されたセカンダリインデックスには、
CREATE INDEX
またはALTER TABLE
ステートメントの実行が終了した時点でテーブルにコミットされたデータのみが含まれます。 コミットされていない値や古いバージョンの値、または削除対象としてマークされているが、まだ古いインデックスから削除されていない値は含まれていません。この操作のパフォーマンス、領域使用量およびセマンティクスに影響する要因もあります。 詳細は、セクション15.12.6「オンライン DDL の制限事項」を参照してください。
-
インデックスの削除
DROP INDEX name ON table;
ALTER TABLE tbl_name DROP INDEX name;
このテーブルは、インデックスの削除中も読取りおよび書込み操作に使用できます。
DROP INDEX
ステートメントは、テーブルにアクセスしているすべてのトランザクションが完了した後にのみ終了するため、インデックスの初期状態にはテーブルの最新の内容が反映されます。 -
インデックスの名前変更
ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name, ALGORITHM=INPLACE, LOCK=NONE;
-
FULLTEXT
インデックスの追加CREATE FULLTEXT INDEX name ON table(column);
ユーザー定義の
FTS_DOC_ID
カラムがない場合は、最初のFULLTEXT
インデックスを追加するとテーブルが再構築されます。 テーブルを再構築せずに、FULLTEXT
インデックスを追加できます。 -
SPATIAL
インデックスの追加CREATE TABLE geom (g GEOMETRY NOT NULL); ALTER TABLE geom ADD SPATIAL INDEX(g), ALGORITHM=INPLACE, LOCK=SHARED;
-
インデックスタイプの変更 (
USING {BTREE | HASH}
)ALTER TABLE tbl_name DROP INDEX i1, ADD INDEX i1(key_part,...) USING BTREE, ALGORITHM=INSTANT;
次のテーブルに、主キー操作のオンライン DDL サポートの概要を示します。 アスタリスクは、追加情報、例外または依存関係を示します。 構文および使用上のノートを参照してください。
表 15.17 主キー操作のオンライン DDL サポート
操作 | インスタント | インプレース | テーブルの再構築 | 同時 DML の許可 | メタデータの変更のみ |
---|---|---|---|---|---|
主キーの追加 | いいえ | はい* | はい* | はい | いいえ |
主キーの削除 | いいえ | いいえ | はい | いいえ | いいえ |
主キーの削除および別の主キーの追加 | いいえ | はい | はい | はい | いいえ |
構文および使用上のノート
-
主キーの追加
ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
テーブルを適切に再構築します。 データは大幅に再編成され、コストのかかる操作になります。 カラムを
NOT NULL
に変換する必要がある場合、特定の条件下でALGORITHM=INPLACE
は許可されません。clustered index を再構築するには、常にテーブルデータのコピーが必要です。 したがって、後で
ALTER TABLE ... ADD PRIMARY KEY
を発行するのではなく、テーブルの作成時に primary key を定義することをお薦めします。UNIQUE
またはPRIMARY KEY
インデックスを作成したとき、MySQL は、いくつかの追加の作業を行う必要があります。UNIQUE
インデックスの場合、MySQL は、テーブルに重複したキーの値が含まれていないことをチェックします。PRIMARY KEY
インデックスの場合も、MySQL は、どのPRIMARY KEY
カラムにもNULL
が含まれていないことをチェックします。ALGORITHM=COPY
句を使用して主キーを追加すると、MySQL は関連付けられたカラムのNULL
値をデフォルト値に変換: 数値の場合は 0、文字ベースのカラムおよび BLOB の場合は空の文字列、DATETIME
の場合は 0000-00-00 00:00:00。 これは非標準の動作であるため、これに依存しないようにすることをお勧めします。ALGORITHM=INPLACE
を使用した主キーの追加は、SQL_MODE
設定にstrict_trans_tables
またはstrict_all_tables
フラグが含まれている場合にのみ許可されます。SQL_MODE
設定が厳密な場合、ALGORITHM=INPLACE
は許可されますが、リクエストされた主キーカラムにNULL
値が含まれている場合、ステートメントは失敗する可能性があります。ALGORITHM=INPLACE
の動作は、より標準に準拠しています。主キーなしでテーブルを作成すると、
InnoDB
によってテーブルが選択されます。これは、NOT NULL
カラムに定義されている最初のUNIQUE
キーまたはシステム生成キーです。 余分な非表示カラムの不確実性および潜在的な領域要件を回避するには、CREATE TABLE
ステートメントの一部としてPRIMARY KEY
句を指定します。MySQL では、既存のデータを元のテーブルから目的のインデックス構造を持つ一時テーブルにコピーすることで、新しいクラスタインデックスが作成されます。 データが一時テーブルに完全にコピーされると、元のテーブルの名前は別の一時テーブル名に変更されます。 新しいクラスタ化されたインデックスで構成される一時テーブルの名前が元のテーブルの名前に変更され、元のテーブルはデータベースから削除されます。
セカンダリインデックスでの操作に適用されるオンラインパフォーマンスの拡張は、主キーインデックスには適用されません。 InnoDB テーブルの行は、主キーに基づいて編成されたクラスタ化されたインデックスに格納されます。これにより、一部のデータベースシステムで「インデックス編成テーブル」と呼ばれるものが形成されます。 テーブル構造は主キーに密接に関連付けられているため、主キーを再定義するには引き続きデータをコピーする必要があります。
主キーに対する操作で
ALGORITHM=INPLACE
が使用される場合は、データが引き続きコピーされるにもかかわらず、次の理由でALGORITHM=COPY
を使用するより効率的です。ALGORITHM=INPLACE
には、Undo ロギングやそれに関連する Redo ロギングが必要ありません。 これらの操作は、ALGORITHM=COPY
を使用する DDL ステートメントのオーバーヘッドを増やします。セカンダリインデックスエントリは事前にソートされているため、順番にロードできます。
セカンダリインデックスへのランダムアクセス挿入は存在しないため、変更バッファーは使用されません。
-
主キーの削除
ALTER TABLE tbl_name DROP PRIMARY KEY, ALGORITHM=COPY;
同じ
ALTER TABLE
ステートメントに新しい主キーを追加せずに主キーを削除できるのは、ALGORITHM=COPY
のみです。 -
主キーの削除および別の主キーの追加
ALTER TABLE tbl_name DROP PRIMARY KEY, ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
データは大幅に再編成され、コストのかかる操作になります。
次のテーブルに、カラム操作のオンライン DDL サポートの概要を示します。 アスタリスクは、追加情報、例外または依存関係を示します。 詳細は、構文および使用上のノートを参照してください。
表 15.18 カラム操作のオンライン DDL サポート
操作 | インスタント | インプレース | テーブルの再構築 | 同時 DML の許可 | メタデータの変更のみ |
---|---|---|---|---|---|
カラムの追加 | はい* | はい | いいえ* | はい* | いいえ |
カラムの削除 | いいえ | はい | はい | はい | いいえ |
カラム名の変更 | いいえ | はい | いいえ | はい* | はい |
カラムの並替え | いいえ | はい | はい | はい | いいえ |
カラムのデフォルト値の設定 | はい | はい | いいえ | はい | はい |
カラムのデータ型の変更 | いいえ | いいえ | はい | いいえ | いいえ |
VARCHAR カラムサイズの拡張 |
いいえ | はい | いいえ | はい | はい |
カラムのデフォルト値の削除 | はい | はい | いいえ | はい | はい |
自動インクリメント値の変更 | いいえ | はい | いいえ | はい | いいえ* |
カラムの NULL 化 |
いいえ | はい | はい* | はい | いいえ |
カラムの NOT NULL 化 |
いいえ | はい* | はい* | はい | いいえ |
ENUM または SET カラムの定義の変更 |
はい | はい | いいえ | はい | はい |
構文および使用上のノート
-
カラムの追加
ALTER TABLE tbl_name ADD COLUMN column_name column_definition, ALGORITHM=INSTANT;
INSTANT
アルゴリズムを使用してカラムを追加する場合は、次の制限が適用されます:カラムの追加は、
ALGORITHM=INSTANT
をサポートしない他のALTER TABLE
アクションと同じステートメントで組み合せることはできません。カラムは、テーブルの最後のカラムとしてのみ追加できます。 他のカラム間の他の位置へのカラムの追加はサポートされていません。
ROW_FORMAT=COMPRESSED
を使用するテーブルにはカラムを追加できません。FULLTEXT
インデックスを含むテーブルにはカラムを追加できません。カラムは一時テーブルに追加できません。 一時テーブルでは、
ALGORITHM=COPY
のみがサポートされます。データディクショナリテーブルスペースに存在するテーブルにはカラムを追加できません。
行サイズ制限は、カラムの追加時には評価されません。 ただし、行サイズ制限は、テーブルの行を挿入および更新する DML 操作中にチェックされます。
同じ
ALTER TABLE
ステートメントに複数のカラムを追加できます。 例:ALTER TABLE t1 ADD COLUMN c2 INT, ADD COLUMN c3 INT, ALGORITHM=INSTANT;
INFORMATION_SCHEMA.INNODB_TABLES
およびINFORMATION_SCHEMA.INNODB_COLUMNS
は、即時に追加されたカラムのメタデータを提供します。INFORMATION_SCHEMA.INNODB_TABLES.INSTANT_COLS
では、最初のインスタントカラムを追加する前に、テーブルのカラム数が表示されます。INFORMATION_SCHEMA.INNODB_COLUMNS.HAS_DEFAULT
およびDEFAULT_VALUE
は、即時に追加されたカラムのデフォルト値に関するメタデータを提供します。auto-increment カラムを追加する場合、同時 DML は許可されません。 データは大幅に再編成され、コストのかかる操作になります。 少なくとも、
ALGORITHM=INPLACE, LOCK=SHARED
が必要です。ALGORITHM=INPLACE
を使用してカラムを追加すると、テーブルが再構築されます。 -
カラムの削除
ALTER TABLE tbl_name DROP COLUMN column_name, ALGORITHM=INPLACE, LOCK=NONE;
データは大幅に再編成され、コストのかかる操作になります。
-
カラム名の変更
ALTER TABLE tbl CHANGE old_col_name new_col_name data_type, ALGORITHM=INPLACE, LOCK=NONE;
同時 DML を許可するには、同じデータ型を保持し、カラム名のみを変更します。
同じデータ型と
[NOT] NULL
属性を保持し、カラム名の変更のみを行う場合、操作は常にオンラインで実行できます。外部キー制約の一部であるカラムの名前を変更することもできます。 外部キー定義は、新しいカラム名を使用するように自動的に更新されます。 外部キーに参加するカラムの名前の変更は、
ALGORITHM=INPLACE
でのみ機能します。ALGORITHM=COPY
句を使用した場合、または他のなんらかの状況でコマンドがバックグラウンドでALGORITHM=COPY
を使用する場合、ALTER TABLE
ステートメントは失敗します。ALGORITHM=INPLACE
では、generated column の名前の変更はサポートされていません。 -
カラムの並替え
カラムの順序を変更するには、
CHANGE
またはMODIFY
操作でFIRST
またはAFTER
を使用します。ALTER TABLE tbl_name MODIFY COLUMN col_name column_definition FIRST, ALGORITHM=INPLACE, LOCK=NONE;
データは大幅に再編成され、コストのかかる操作になります。
-
カラムのデータ型の変更
ALTER TABLE tbl_name CHANGE c1 c1 BIGINT, ALGORITHM=COPY;
カラムのデータ型の変更は、
ALGORITHM=COPY
でのみサポートされます。 -
VARCHAR
カラムサイズの拡張ALTER TABLE tbl_name CHANGE COLUMN c1 c1 VARCHAR(255), ALGORITHM=INPLACE, LOCK=NONE;
VARCHAR
カラムに必要な長さバイト数は、同じままにする必要があります。 サイズが 0 から 255 バイトのVARCHAR
カラムの場合、値のエンコードには長さバイトが必要です。 256 バイト以上のVARCHAR
カラムの場合は、長さが 2 バイト必要です。 その結果、インプレースALTER TABLE
では、VARCHAR
カラムサイズの 0 から 255 バイト、または 256 バイトからそれより大きいサイズへの増加のみがサポートされます。 インプレースALTER TABLE
では、VARCHAR
カラムのサイズを 256 バイト未満から 256 バイト以上に増やすことはサポートされていません。 この場合、必要な長さバイト数は 1 から 2 に変更され、テーブルコピー (ALGORITHM=COPY
) でのみサポートされます。 たとえば、シングルバイト文字セットのVARCHAR
カラムサイズを、インプレースALTER TABLE
を使用して VARCHAR(255) から VARCHAR(256) に変更しようとすると、次のエラーが返されます:ALTER TABLE tbl_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256); ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
注記VARCHAR
カラムのバイト長は、文字セットのバイト長によって異なります。インプレース
ALTER TABLE
を使用したVARCHAR
サイズの縮小はサポートされていません。VARCHAR
サイズを小さくするには、テーブルコピー (ALGORITHM=COPY
) が必要です。 -
カラムのデフォルト値の設定
ALTER TABLE tbl_name ALTER COLUMN col SET DEFAULT literal, ALGORITHM=INSTANT;
テーブルメタデータのみを変更します。 デフォルトのカラム値は data dictionary に格納されます。
-
カラムのデフォルト値の削除
ALTER TABLE tbl ALTER COLUMN col DROP DEFAULT, ALGORITHM=INSTANT;
-
自動インクリメント値の変更
ALTER TABLE table AUTO_INCREMENT=next_value, ALGORITHM=INPLACE, LOCK=NONE;
データファイルではなく、メモリーに格納された値を変更します。
レプリケーションまたはシャーディングを使用する分散システムでは、テーブルの自動増分カウンタを特定の値にリセットすることがあります。 テーブルに挿入された次の行は、その自動インクリメントカラムの指定された値を使用します。 この方法は、すべてのテーブルを定期的に空にしてリロードし、自動増分順序を 1 から再開するデータウェアハウス環境でも使用できます。
-
カラムの
NULL
化ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NULL, ALGORITHM=INPLACE, LOCK=NONE;
テーブルを適切に再構築します。 データは大幅に再編成され、コストのかかる操作になります。
-
カラムの
NOT NULL
化ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NOT NULL, ALGORITHM=INPLACE, LOCK=NONE;
テーブルを適切に再構築します。 操作を成功させるには、
STRICT_ALL_TABLES
またはSTRICT_TRANS_TABLES
SQL_MODE
が必要です。 カラムに NULL 値が含まれている場合、操作は失敗します。 サーバーは、参照整合性が失われる可能性がある外部キーカラムの変更を禁止します。 セクション13.1.9「ALTER TABLE ステートメント」を参照してください。 データは大幅に再編成され、コストのかかる操作になります。 -
ENUM
またはSET
カラムの定義の変更CREATE TABLE t1 (c1 ENUM('a', 'b', 'c')); ALTER TABLE t1 MODIFY COLUMN c1 ENUM('a', 'b', 'c', 'd'), ALGORITHM=INSTANT;
新しい列挙を追加するか、有効なメンバー値のリストの end にメンバーを設定して、
ENUM
またはSET
カラムの定義を変更すると、データ型の記憶域サイズが変更されないかぎり、すぐに実行することも、その場で実行することもできます。 たとえば、8 つのメンバーを持つSET
カラムにメンバーを追加すると、値ごとに必要な記憶域が 1 バイトから 2 バイトに変更されます。これにはテーブルのコピーが必要です。 リストの途中にメンバーを追加すると、既存のメンバーの番号が変更されます。これには、テーブルコピーが必要になります。
次のテーブルに、生成されるカラム操作のオンライン DDL サポートの概要を示します。 詳細は、構文および使用上のノートを参照してください。
表 15.19 生成されたカラム操作のオンライン DDL サポート
操作 | インスタント | インプレース | テーブルの再構築 | 同時 DML の許可 | メタデータの変更のみ |
---|---|---|---|---|---|
STORED カラムの追加 |
いいえ | いいえ | はい | いいえ | いいえ |
STORED カラムの順序の変更 |
いいえ | いいえ | はい | いいえ | いいえ |
STORED カラムの削除 |
いいえ | はい | はい | はい | いいえ |
VIRTUAL カラムの追加 |
はい | はい | いいえ | はい | はい |
VIRTUAL カラムの順序の変更 |
いいえ | いいえ | はい | いいえ | いいえ |
VIRTUAL カラムの削除 |
はい | はい | いいえ | はい | はい |
構文および使用上のノート
-
STORED
カラムの追加ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) STORED), ALGORITHM=COPY;
式はサーバーによって評価される必要があるため、
ADD COLUMN
はストアドカラムのインプレース操作ではありません (一時テーブルを使用せずに実行されます)。 -
STORED
カラムの順序の変更ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED FIRST, ALGORITHM=COPY;
テーブルを適切に再構築します。
-
STORED
カラムの削除ALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INPLACE, LOCK=NONE;
テーブルを適切に再構築します。
-
VIRTUAL
カラムの追加ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL), ALGORITHM=INSTANT;
仮想カラムの追加は、即時に実行することも、パーティション化されていないテーブルに対して適切に実行することもできます。
VIRTUAL
の追加は、パーティションテーブルのインプレース操作ではありません。 -
VIRTUAL
カラムの順序の変更ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL FIRST, ALGORITHM=COPY;
-
VIRTUAL
カラムの削除ALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INSTANT;
VIRTUAL
カラムの削除は、即時に実行することも、パーティション化されていないテーブルに対して適切に実行することもできます。
次のテーブルに、外部キー操作のオンライン DDL サポートの概要を示します。 アスタリスクは、追加情報、例外または依存関係を示します。 詳細は、構文および使用上のノートを参照してください。
表 15.20 外部キー操作のオンライン DDL サポート
操作 | インスタント | インプレース | テーブルの再構築 | 同時 DML の許可 | メタデータの変更のみ |
---|---|---|---|---|---|
外部キー制約の追加 | いいえ | はい* | いいえ | はい | はい |
外部キー制約の削除 | いいえ | はい | いいえ | はい | はい |
構文および使用上のノート
-
外部キー制約の追加
INPLACE
アルゴリズムは、foreign_key_checks
が無効な場合にサポートされます。 それ以外の場合は、COPY
アルゴリズムのみがサポートされます。ALTER TABLE tbl1 ADD CONSTRAINT fk_name FOREIGN KEY index (col1) REFERENCES tbl2(col2) referential_actions;
-
外部キー制約の削除
ALTER TABLE tbl DROP FOREIGN KEY fk_name;
外部キーの削除は、
foreign_key_checks
オプションが有効または無効になった状態でオンラインで実行できます。特定のテーブル上の外部キー制約の名前がわからない場合は、次のステートメントを発行し、各外部キーに対する
CONSTRAINT
句で制約名を見つけます。SHOW CREATE TABLE table\G
または、
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
テーブルをクエリーして、CONSTRAINT_NAME
カラムおよびCONSTRAINT_TYPE
カラムを使用して外部キー名を識別します。単一のステートメントで外部キーとそれに関連付けられたインデックスを削除することもできます:
ALTER TABLE table DROP FOREIGN KEY constraint, DROP INDEX index;
変更対象のテーブルに foreign keys がすでに存在する場合 (つまり、FOREIGN KEY ... REFERENCE
句を含む child table である場合)、外部キーカラムが直接関係していない場合でも、オンライン DDL 操作に追加の制限が適用されます:
親テーブルに対する変更によって、
CASCADE
またはSET NULL
パラメータを使用したON UPDATE
またはON DELETE
句を介して子テーブルの関連する変更が発生した場合、子テーブルのALTER TABLE
は別のトランザクションがコミットされるのを待機できます。同様に、テーブルが外部キー関係の parent table である場合、
FOREIGN KEY
句が含まれていなくても、INSERT
、UPDATE
またはDELETE
ステートメントによって子テーブルのON UPDATE
またはON DELETE
アクションが完了するまでALTER TABLE
を待機できます。
次のテーブルに、テーブル操作のオンライン DDL サポートの概要を示します。 アスタリスクは、追加情報、例外または依存関係を示します。 詳細は、構文および使用上のノートを参照してください。
表 15.21 テーブル操作のオンライン DDL サポート
操作 | インスタント | インプレース | テーブルの再構築 | 同時 DML の許可 | メタデータの変更のみ |
---|---|---|---|---|---|
ROW_FORMAT の変更 |
いいえ | はい | はい | はい | いいえ |
KEY_BLOCK_SIZE の変更 |
いいえ | はい | はい | はい | いいえ |
永続テーブルの統計の設定 | いいえ | はい | いいえ | はい | はい |
文字セットの指定 | いいえ | はい | はい* | いいえ | いいえ |
文字セットの変換 | いいえ | いいえ | はい* | いいえ | いいえ |
テーブルの最適化 | いいえ | はい* | はい | はい | いいえ |
FORCE オプションを使用した再構築 |
いいえ | はい* | はい | はい | いいえ |
null の再構築の実行 | いいえ | はい* | はい | はい | いいえ |
テーブル名の変更 | はい | はい | いいえ | はい | はい |
構文および使用上のノート
-
ROW_FORMAT
の変更ALTER TABLE tbl_name ROW_FORMAT = row_format, ALGORITHM=INPLACE, LOCK=NONE;
データは大幅に再編成され、コストのかかる操作になります。
ROW_FORMAT
オプションの詳細は、テーブルオプション を参照してください。 -
KEY_BLOCK_SIZE
の変更ALTER TABLE tbl_name KEY_BLOCK_SIZE = value, ALGORITHM=INPLACE, LOCK=NONE;
データは大幅に再編成され、コストのかかる操作になります。
KEY_BLOCK_SIZE
オプションの詳細は、テーブルオプション を参照してください。 -
永続テーブル統計オプションの設定
ALTER TABLE tbl_name STATS_PERSISTENT=0, STATS_SAMPLE_PAGES=20, STATS_AUTO_RECALC=1, ALGORITHM=INPLACE, LOCK=NONE;
テーブルメタデータのみを変更します。
永続統計には、
STATS_PERSISTENT
、STATS_AUTO_RECALC
およびSTATS_SAMPLE_PAGES
が含まれます。 詳細は、セクション15.8.10.1「永続的オプティマイザ統計のパラメータの構成」を参照してください。 -
文字セットの指定
ALTER TABLE tbl_name CHARACTER SET = charset_name, ALGORITHM=INPLACE, LOCK=NONE;
新しい文字エンコーディングが別のものである場合は、テーブルを再構築します。
-
文字セットの変換
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name, ALGORITHM=COPY;
新しい文字エンコーディングが別のものである場合は、テーブルを再構築します。
-
テーブルの最適化
OPTIMIZE TABLE tbl_name;
インプレース操作は、
FULLTEXT
インデックスのあるテーブルではサポートされていません。 この操作ではINPLACE
アルゴリズムを使用しますが、ALGORITHM
およびLOCK
構文は許可されていません。 -
FORCE
オプションを使用したテーブルの再構築ALTER TABLE tbl_name FORCE, ALGORITHM=INPLACE, LOCK=NONE;
MySQL 5.6.17
.
ALGORITHM=INPLACE
is not supported for tables withFULLTEXT
インデックスの時点でALGORITHM=INPLACE
を使用します。 -
「null」再構築の実行
ALTER TABLE tbl_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;
MySQL 5.6.17 の時点では、
ALGORITHM=INPLACE
を使用します。ALGORITHM=INPLACE
は、FULLTEXT
インデックスのあるテーブルではサポートされていません。 -
テーブル名の変更
ALTER TABLE old_tbl_name RENAME TO new_tbl_name, ALGORITHM=INSTANT;
テーブルの名前変更は、即時に実行することも、インプレースで実行することもできます。 MySQL は、コピーを作成せずに、テーブル
tbl_name
に対応するファイルの名前を変更します。 (RENAME TABLE
ステートメントを使用してテーブルの名前を変更することもできます。 セクション13.1.36「RENAME TABLE ステートメント」を参照してください。) 名前を変更したテーブル専用に付与された権限は、新しい名前に移行されません。 それらは、手動で変更する必要があります。
次のテーブルに、テーブルスペース操作のオンライン DDL サポートの概要を示します。 詳細は、構文および使用上のノートを参照してください。
表 15.22 テーブルスペース操作のオンライン DDL サポート
操作 | インスタント | インプレース | テーブルの再構築 | 同時 DML の許可 | メタデータの変更のみ |
---|---|---|---|---|---|
一般テーブルスペースの名前の変更 | いいえ | はい | いいえ | はい | はい |
一般的なテーブルスペース暗号化の有効化または無効化 | いいえ | はい | いいえ | はい | いいえ |
file-per-table テーブルスペース暗号化の有効化または無効化 | いいえ | いいえ | はい | いいえ | いいえ |
構文および使用上のノート
-
一般テーブルスペースの名前の変更
ALTER TABLESPACE tablespace_name RENAME TO new_tablespace_name;
ALTER TABLESPACE ... RENAME TO
はINPLACE
アルゴリズムを使用しますが、ALGORITHM
句はサポートしていません。 -
一般的なテーブルスペース暗号化の有効化または無効化
ALTER TABLESPACE tablespace_name ENCRYPTION='Y';
ALTER TABLESPACE ... ENCRYPTION
はINPLACE
アルゴリズムを使用しますが、ALGORITHM
句はサポートしていません。関連情報については、セクション15.13「InnoDB 保存データ暗号化」を参照してください。
-
file-per-table テーブルスペース暗号化の有効化または無効化
ALTER TABLE tbl_name ENCRYPTION='Y', ALGORITHM=COPY;
関連情報については、セクション15.13「InnoDB 保存データ暗号化」を参照してください。
一部の ALTER TABLE
パーティション化句を除き、パーティション化された InnoDB
テーブルのオンライン DDL 操作は、通常の InnoDB
テーブルに適用されるのと同じルールに従います。
一部の ALTER TABLE
パーティション化句は、通常の非パーティション InnoDB
テーブルと同じ内部オンライン DDL API を経由しません。 その結果、ALTER TABLE
パーティション化句のオンラインサポートは異なります。
次のテーブルに、各 ALTER TABLE
パーティション化ステートメントのオンラインステータスを示します。 使用されるオンライン DDL API に関係なく、MySQL は可能な場合はデータのコピーおよびロックを最小限に抑えようとします。
ALGORITHM=COPY
を使用するか、「ALGORITHM=DEFAULT, LOCK=DEFAULT
」 のみを許可する ALTER TABLE
パーティション化オプションでは、COPY
アルゴリズムを使用してテーブルを再パーティション化します。 つまり、新しいパーティション化されたテーブルは、新しいパーティション化スキームで作成されます。 新しく作成されたテーブルには、ALTER TABLE
ステートメントによって適用された変更が含まれ、テーブルデータが新しいテーブル構造にコピーされます。
表 15.23 パーティション化操作のオンライン DDL サポート
Partitioning 句 | インスタント | インプレース | DML を許可 | メモ |
---|---|---|---|---|
PARTITION BY |
いいえ | いいえ | いいえ |
ALGORITHM=COPY 、LOCK={DEFAULT|SHARED|EXCLUSIVE} を許可 |
ADD PARTITION |
いいえ | はい* | はい* |
ALGORITHM=INPLACE, LOCK={DEFAULT|NONE|SHARED|EXCLUSISVE} は、RANGE および LIST パーティション、HASH および KEY パーティションの ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSISVE} およびすべてのパーティションタイプの ALGORITHM=COPY, LOCK={SHARED|EXCLUSIVE} でサポートされています。 RANGE または LIST によってパーティション化されたテーブルの既存のデータはコピーしません。 MySQL は共有ロックを保持しながらデータをコピーするため、HASH または LIST によってパーティション化されたテーブルに対して ALGORITHM=COPY で同時クエリーが許可されます。 |
DROP PARTITION |
いいえ | はい* | はい* |
|
DISCARD PARTITION |
いいえ | いいえ | いいえ |
ALGORITHM=DEFAULT 、LOCK=DEFAULT のみを許可 |
IMPORT PARTITION |
いいえ | いいえ | いいえ |
ALGORITHM=DEFAULT 、LOCK=DEFAULT のみを許可 |
TRUNCATE PARTITION |
いいえ | はい | はい | 既存のデータをコピーしません。 行を削除するだけで、テーブル自体またはそのパーティションの定義は変更されません。 |
COALESCE PARTITION |
いいえ | はい* | いいえ |
ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} がサポートされています。 |
REORGANIZE PARTITION |
いいえ | はい* | いいえ |
ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} がサポートされています。 |
EXCHANGE PARTITION |
いいえ | はい | はい | |
ANALYZE PARTITION |
いいえ | はい | はい | |
CHECK PARTITION |
いいえ | はい | はい | |
OPTIMIZE PARTITION |
いいえ | いいえ | いいえ |
ALGORITHM 句および LOCK 句は無視されます。 テーブル全体を再構築します。 セクション24.3.4「パーティションの保守」を参照してください。 |
REBUILD PARTITION |
いいえ | はい* | いいえ |
ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} がサポートされています。 |
REPAIR PARTITION |
いいえ | はい | はい | |
REMOVE PARTITIONING |
いいえ | いいえ | いいえ |
ALGORITHM=COPY 、LOCK={DEFAULT|SHARED|EXCLUSIVE} を許可 |
パーティションテーブルに対する非パーティション化オンライン ALTER TABLE
操作は、通常のテーブルに適用されるのと同じルールに従います。 ただし、ALTER TABLE
は各テーブルパーティションに対してオンライン操作を実行するため、複数のパーティションで操作が実行されるため、システムリソースに対する需要が増加します。
ALTER TABLE
パーティション化句の詳細は、パーティショニングオプション および セクション13.1.9.1「ALTER TABLE パーティション操作」 を参照してください。 一般的なパーティション化については、第24章「パーティション化」 を参照してください。