ALGORITHM = INPLACEよりもALGORITHM = COPYを好むのはなぜですか?


16

MySQL 5.6にはオンラインDDLが導入されたため、ALTER TABLEコマンドにはオプションでいずれALGORITHM=INPLACEかをALGORITHM=COPY指定または指定できます。オンラインDDL概要では、デフォルトでINPLACEは可能な限り使用され、アルゴリズムが安価であることを(まったく述べずに)示していINPLACEますCOPY

それではALGORITHM=COPYALTER TABLEステートメントで指定しなければならない理由は何ですか?


COPYを使用する場合、テーブルのインデックスはどうなりますか?新しいテーブルが作成され、ゼロから作成されたため、インデックスの断片化が解消されますか?
デイブプール

COPYが最初から読み込まれる場合、遅いオプションですが、インデックスの最適化により、結果のテーブルのパフォーマンスが向上する可能性があります。
デイブプール

@DavePooleニースの理論が、私は以来、それは的外れだ疑いOPTIMIZE TABLE(私はその大部分としてインデックスをデフラグしていると信じている目的は)使用ALGORITHM=INPLACEのMySQL 5.7.4のよう。私が思うので、それは、はい、ケースだCOPY デフラグインデックスを、しかし、そうするINPLACEの潜在的な利点として、それを無効化する、(何とか)COPY
マークアメリー

2
「MySQLの5.6の前に作成されたInnoDBテーブルはサポートしていないALTER TABLE ... ALGORITHM=INPLACE一時的な列(DATE、DATETIMEまたはTIMESTAMP)が含まれたテーブル用と使用して再構築されませんでしたALTER TABLE ... ALGORITHM=COPY」... オンラインDDLの制限事項
JSapkota

回答:


10

はい、を指定できる場合がありますがCOPY、パフォーマンス以外の理由によるものです。

MySQLが新機能-バージョン5.6でのオンラインDLL処理を導入したことを理解することが重要です。オフライン処理は削除されませんでした。したがって、これら2つのモードを区別する必要があります。

  1. 一部の操作はオフラインモードでのみ機能します。インプレースで実行できる、または実行できないDDL操作のリストについては、表15.10「DDL操作のオンラインステータスの概要」を参照してください。

  2. オンラインモードとオフラインモードでの操作の動作はわずかに異なるため、互換性の理由から「古い」操作を選択できます。

いくつかの例(詳細を提案してください):

  1. MySQL 5.6より前に作成されたInnoDBテーブルALTER TABLE ... ALGORITHM=INPLACEは、テンポラルカラム(または)を含むテーブルをサポートせずDATE、を使用して再構築されていません。この場合、操作はエラーを返します。DATETIMETIMESTAMPALTER TABLE ... ALGORITHM=COPYALTER TABLE ... ALGORITHM=INPLACE

  2. ADD PRIMARY KEY句は、そのデータ型のデフォルト値(INTの場合は0、varcharの場合は空の文字列)にCOPY modeサイレントに変換NULLしますが、それをIN_PLACE行いません。

ALGORITHM = COPY句を使用すると、主キー列にNULL値が存在しても、操作は成功します。データは静かに変更され、問題を引き起こす可能性があります。

好むもう一つの理由COPY

ALGORITHM = COPYまたはold_alter_table = 1を指定する操作。特殊なシナリオでの正確な後方互換性のために必要な場合、テーブルのコピー動作を強制します。

MySQLのマニュアルでは実際のシナリオについては説明していませんが、いくつか想像できます。たとえば、開発者はALTER INDEX操作中にテーブルがロックされることに依存していたため、テーブルは読み取り専用または完全にロックされ、インデックスの再構築中に静的テーブルを読み取るプロセスがあります。


1
ALGORITHM=INPLACE実際に使用したいのに、人々は「これはオンラインDDLであり、データベースをロックしない」とも混同する傾向があると思いますLOCK=NONE
ブレンダンバード

2

@Stolegがおそらく最良の答えを持っていますが、もう1つあります。に=COPY重大なバグがあった場合に備えて、開発者が脱出用のハッチとして残したというのは経験に基づいた推測です=INLINE。これにより、ユーザーはALTER新しい機能が壊れた場合でも引き続き使用できます。

私は長年にわたってこのようなものを見ました(フラグsql_modemy.cnf設定など)。新しいリリースの意図は、明らかに、新しい、より良い機能を引き出すことです。

最適化フラグはこのカテゴリに分類されますが、以前のアクションに固執する理由はさらにあります。オプティマイザーは常に「間違った処理を行う」ことがあります。可能性が多すぎます。


1
なぜ「後方互換性」ではなく「エスケープハッチ」と呼ぶのですか?大きな違いはないかもしれませんが;)
ストーレグ

1
両方のバージョンで同じコードを実行する必要がある場合、「下位互換性」と言います。しかし、それから、新しい構文が古いバージョンで認識されたかどうかを心配します。
リック・ジェームズ

-1

InnoDBテーブルスペース暗号化をサポートするMySQLのバージョンでは、暗号化を追加するためにテーブルを変更する場合、必要に応じてコピーアルゴリズムを使用して変更が行われます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.