Repair by sorting
提供:MySQL Practice Wiki
目次 |
説明
ALTER TABLE ... ENABLE KEYSステートメントをMyISAMテーブルに対して実行する場合やインデックスの修復を行う際、MyISAMは以下の2通りのうちいずれかの方法によりインデックスの修復を試みる。
- Repair by sorting
- Repair with keycache
名前からすると後者の方が速そうだが、実は前者の方が遙かに速い。ただしこの手法を用いるにはソート用のバッファが確保されている必要があるのだが、これが実にやっかいである。バッファのサイズがとてつもなく大きいのだ。バッファはmyisam_max_sort_file_sizeにて指定するが、必要な分だけ確保するようになっているので100Gぐらいにしておいて差し支えないだろう。ファイルシステムがいっぱいになったり、ここに指定した値を超えてバッファが必要な場合には、Repair with keycacheに自動的に切り替わる。
実際に消費するバッファのサイズは、以下の式により計算することが出来る。
(1行ごとのインデックスの論理的な最大値 + MyISAMポインタサイズ + キーがNULLを含む場合はさらに1バイト) x 行数
「1行ごとのインデックスの論理的な最大値」というのがくせ者で、MyISAMのインデックスは圧縮されるのだが、全て展開したのと同じだけのサイズが必要になる。もっと具体的に言うと、VARCHAR(255)というカラムに対するインデックスの場合、
255 x 1文字あたりの最大バイト数(例えばUTF8の場合は3) + カラムの長さを表すための1バイト = 766バイト
だけのサイズが必要となる。これは例えVARCHARに1バイトしか格納されないような場合でも必要で、VARCHAR自体が実際に必要なバイト数分しか領域を消費しないということに比べると、インデックスの論理的な最大値は非常に大きなサイズとなる。しかしRepair by sortingにはこの領域が必要なので、思い切って領域を割り当てるようにしよう。
確認方法
実際に修復処理がどちらの方法で行われているかを観測するには、SHOW PROCESSLISTコマンドを使用する。Stateの項目のところにRepair by sortingと表示されているはずである。
バッファリングでさらに高速化
myisam_max_sort_file_sizeだけでなく、myisam_sort_buffer_sizeを増やしておくとメモリ上でバッファリングが行われるので、Repair by sortingがさらに高速になる。REPAIR TABLEやLOAD DATAで非常に大きなテーブルを扱う場合、myisam_sort_buffer_sizeを増やしておくと良いだろう。myisam_sort_buffer_sizeは動的に変更出来るが、実際に必要なメモリを確保するために他のバッファを削る等の措置が必要になるので、本当に処理を速く完了させたい場合にはメンテナンスウィンドウを確保することを推奨する。
適合するバージョン
- MySQL Server 4.x
- MySQL Server 5.x