TABLEを上手に使いこなそう。sidebarちょっと硬派なコンピュータフリークのBlogです。TABLEを上手に使いこなそう。テーブル定義を変更したい。インデックスが壊れてしまったので再作成したい。TABLEはテーブル定義を変更するお馴染みのコマンドであるが、その挙動は意外と知られていない。(エキスパートとおぼしき方々からも度々質問を受ける。TABLEについて解説しようと思う。TABLEはテーブルのデータを全てコピーし直すのである。なんて無駄なことを!?と思うかも知れないが、テーブル定義(スキーマ)の変更を動的に行うには、ストレージエンジンによるサポートが必要であり、動的なスキーマ変更をサポートしているストレージエンジンはまだ少ないのである。Clusterぐらいだ。)デフォルトで利用出来るMyISAMはInnoDBでは、全てのデータをコピーし直すのである。その場合の動作は次の通りだ。テーブルをTL_WRITE_ALLOW_READロックする。このロックは特殊なロックで、テーブルロックの一種であるが、他のセッションからのREADを許可し、WRITEをブロックする。新しいテーブル定義を使って空のテンポラリテーブルを作成する。古いテーブルから新しいテーブルへデータをコピーする。テーブルの名前を付け替えて、新しいテーブルを古いテーブルと同じ名前にする。古いテーブルは破棄する。新しいテーブルへブロックしていたWRITEをリダイレクトする。そんなわけで、大きなテーブルをALTERするときには長時間WRITEがブロックされてしまうので注意しよう。TABLEでは完全なテーブルのコピーを作成する必要があるので、元のテーブルのサイズと同じぐらいのディスク空き容量が必要であることにも注意しなければいけない。TABLEコマンドは失敗してしまう。TABLEコマンドであるが、使いようによっては便利な面もある。コマンドの実行中もテーブルからREADが出来るからだ。TABLEコマンドを使うのだが、これらのコマンドはWRITEだけでなくREADもブロックしてしまう。TABLEを試して見るといいだろう。TABLEコマンドを実行するといい。TABLEコマンドによってテーブルの再作成が行われるのである。ストレージエンジンは元のテーブルと同じものを指定する必要がある。STATUSコマンドでストレージエンジンを確認しよう。TABLEコマンドは意外と速い。テーブルの単純なコピーが行われるだけだからだ。MySQL公式のemployeesデータベースのsalariesテーブルには2844047行のデータが格納されているが、そのテーブルでも次の通りである。0ただし、この値はあくまでも参考値ということで捕らえて欲しい。RAIDやSSDなどを使っている場合にはもっと良い数値になるだろう。行数が増えた場合には所要時間は線形に増加するわけでない点にも注意しよう。N)の時間がかかるからだ。10倍の行数がある場合には、10倍以上の時間がかかる。メンテナンス時間を見積もるには、試験環境で同程度の行数のテーブルを使ってテストしなければならない。TABLEは操作が正常に完了するまでは元のテーブルに対して一切の変更を加えない。コマンド実行中にマシンがクラッシュしても、テンポラリテーブルの残骸が残るだけで、元のテーブルは元通りである。TABLEはとても安全な操作であるとも言える。上記のようなメンテナンスでなく、本当にスキーマの変更をしたい場合には注意するべき点が一つある。コマンドが一回で終わるように、カラムやインデックスの追加・削除を一行で書くということである。TABLEを書くには、加えるべき変更をカンマで区切って羅列する。(idxX);こうすることで、コピーが一回で済むわけである。テーブルサイズが大きくなればなるほど、操作を一回で済ませることのメリットは大きくなる。TABLEでは、カラムを任意の場所に追加することが出来る。何も指定しない場合は最後尾に追加されるが、FIRSTまたはAFTERオプションを指定することで、先頭または任意のカラムの後にカラムを挿入できるのである。これは、テーブルを再作成することのメリットである。TABLEコマンドを使う際のテクニックを紹介した。TABLEを上手に使いこなして欲しい。さんのコメント...興味深い内容をありがとうございます。指摘ありがとうございます!!修正しました。N)は一行挿入時のオーダーでした。さんのコメント...興味深い内容をありがとうございます。TABLE"を実行した場合、元からあったインデックスは、自動的に更新されるのでしょうか、それとも、削除して再作成する必要があるのでしょうか。TABLEを実行すると、インデックスもすべて再構築されます。TABLEの正体です。Okuno私は所謂ギークです。普段はMySQL関係の仕事をしています。今の時代、フリーソフトウェア(自由なソフトウェア)こそギークの歩く道だと信じています。コンピュータに手を染めてはや二十年。コンピュータ道はいくら進んでも終わりが見えない果てしない世界。コンピュータにはロマンがある。男に生まれたからにはロマンを追わずして居られようか!詳細プロフィールを表示リンクはどうぞご自由に。Replicationテストのお願い。6.0Wikipediaのライセンスがクリエイティブコモンズになった。限界までMySQLを使い尽くす!!Nokiaは引くタイミングを間違ったんじゃないだろうか。TABLEを上手に使いこなそう。本ブログにおいて示されている見解は、私自身の見解であって、オラクルの見解を必ずしも反映したものではありません。