:: DEVELOPER ZONE
myisampack は MyISAM テーブルの圧縮に、pack_isam は ISAM テーブルの圧縮に使用します。ISAM テーブルは廃止されているため、ここでは myisampack に限って話を進めますが、myisampack について説明することはすべて、pack_isam にも当てはまります。
myisampack は、テーブル内の各カラムを個別に圧縮します。テーブルを開いたとき、カラムを展開するための情報がメモリに読み込まれます。これにより、個々のレコードにアクセスする際のパフォーマンスが向上します。この場合、Stacker を MS-DOS で使用するときのような大きなディスクブロックではなく、1 つのレコードだけを解凍するだけで済みます。
通常、myisampack はデータファイルを 40% 〜 70% 圧縮します。
MySQL は、圧縮テーブルでメモリマッピング(mmap())を使用し、mmap() が機能しない場合は、通常のファイルの読み取り/書き込み使用法に戻ります。
以下に注意してください。
パック後、テーブルは読み取り専用になる。これは、CD にパックされたテーブルへのアクセスなど、読み取り専用でいいとの判断からそうしているものである。パックされたテーブルへの書き込み機能の実現も開発計画には入っているが、優先順位は高くない。
myisampack は、BLOB カラムまたは TEXT カラムもパックできる。
古い pack_isam(ISAM テーブル用)ではパックできない。
myisampack は以下のコマンドで起動します。
shell> myisampack [options] filename ...
各ファイル名は、インデックス(.MYI)ファイル名になっていることが必要です。データディレクトリがカレントディレクトリでなければ、ファイルのパスを指定してください。.MYI 拡張子は省略可能です。
myisampack は、以下のオプションをサポートします。
-b, --backup
テーブルのバックアップを tbl_name.OLD として作成する。
-#, --debug=debug_options
デバッグログを出力する。debug_options 文字列には、'd:t:o,filename' がよく使用される。
-f, --force
テーブルが大きくなってしまう場合、テンポラリファイルが存在する場合でもテーブルのパックを強制する。myisampack は、テーブルの圧縮中、tbl_name.TMD という名前のテンポラリファイルを生成する。myisampack を強制終了した場合、.TMD ファイルが削除されない場合がある。通常、tbl_name.TMD があれば、myisampack はエラーを出力して終了する。--force を使用すると、テンポラリファイルの有無に関わらず myisampack はテーブルをパックする。
-?, --help
ヘルプメッセージを表示して終了する。
-j big_tbl_name, --join=big_tbl_name
コマンドラインで指定されたすべてのテーブルを結合して 1 つのテーブル big_tbl_name にする。結合するテーブルはすべて、同一(同じカラム名、同じ型、同じインデックスなど)のテーブルであることが必要である。
-p #, --packlength=#
レコード長保存サイズをバイト単位で指定する。値は 1、2、または 3 であることが必要。myisampack は、すべてのレコードを 1、2、または 3 バイトの長さポインタで保存する。ほとんどの場合、myisampack はファイルをパックする前に、正しい長さを判断できるが、パック中にさらに短くてもよいことを認識する場合がある。この場合、myisampack は、次回同じファイルをパックするときに、レコード長を短くできるというメモを出力する。
-s, --silent
サイレントモード。エラー発生時のみ出力する。
-t, --test
実際にはテーブルをパックせず、パックテストのみ実行する。
-T dir_name, --tmp_dir=dir_name
テンポラリテーブルを書き込むディレクトリを指定する。
-v, --verbose
冗長モード。パックの進捗および結果に関する情報を出力する。
-V, --version
バージョン情報を表示して終了する。
-w, --wait
テーブルが使用中の場合、待機して再試行する。mysqld サーバが --skip-external-locking オプションで起動しいる場合、パッキングプロセス中にテーブルが更新される可能性があれば、myisampack を使用すべきではない。
以下のコマンドシーケンスは、一般的なテーブル圧縮を示しています。
shell> ls -l station.* -rw-rw-r-- 1 monty my 994128 Apr 17 19:00 station.MYD -rw-rw-r-- 1 monty my 53248 Apr 17 19:00 station.MYI -rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm shell> myisamchk -dvv station MyISAM file: station Isam-version: 2 Creation time: 1996-03-13 10:08:58 Recover time: 1997-02-02 3:06:43 Data records: 1192 Deleted blocks: 0 Datafile: Parts: 1192 Deleted data: 0 Datafile pointer (bytes): 2 Keyfile pointer (bytes): 2 Max datafile length: 54657023 Max keyfile length: 33554431 Recordlength: 834 Record format: Fixed length table description: Key Start Len Index Type Root Blocksize Rec/key 1 2 4 unique unsigned long 1024 1024 1 2 32 30 multip. text 10240 1024 1 Field Start Length Type 1 1 1 2 2 4 3 6 4 4 10 1 5 11 20 6 31 1 7 32 30 8 62 35 9 97 35 10 132 35 11 167 4 12 171 16 13 187 35 14 222 4 15 226 16 16 242 20 17 262 20 18 282 20 19 302 30 20 332 4 21 336 4 22 340 1 23 341 8 24 349 8 25 357 8 26 365 2 27 367 2 28 369 4 29 373 4 30 377 1 31 378 2 32 380 8 33 388 4 34 392 4 35 396 4 36 400 4 37 404 1 38 405 4 39 409 4 40 413 4 41 417 4 42 421 4 43 425 4 44 429 20 45 449 30 46 479 1 47 480 1 48 481 79 49 560 79 50 639 79 51 718 79 52 797 8 53 805 1 54 806 1 55 807 20 56 827 4 57 831 4 shell> myisampack station.MYI Compressing station.MYI: (1192 records) - Calculating statistics normal: 20 empty-space: 16 empty-zero: 12 empty-fill: 11 pre-space: 0 end-space: 12 table-lookups: 5 zero: 7 Original trees: 57 After join: 17 - Compressing file 87.14% shell> ls -l station.* -rw-rw-r-- 1 monty my 127874 Apr 17 19:00 station.MYD -rw-rw-r-- 1 monty my 55296 Apr 17 19:04 station.MYI -rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm shell> myisamchk -dvv station MyISAM file: station Isam-version: 2 Creation time: 1996-03-13 10:08:58 Recover time: 1997-04-17 19:04:26 Data records: 1192 Deleted blocks: 0 Datafile: Parts: 1192 Deleted data: 0 Datafilepointer (bytes): 3 Keyfile pointer (bytes): 1 Max datafile length: 16777215 Max keyfile length: 131071 Recordlength: 834 Record format: Compressed table description: Key Start Len Index Type Root Blocksize Rec/key 1 2 4 unique unsigned long 10240 1024 1 2 32 30 multip. text 54272 1024 1 Field Start Length Type Huff tree Bits 1 1 1 constant 1 0 2 2 4 zerofill(1) 2 9 3 6 4 no zeros, zerofill(1) 2 9 4 10 1 3 9 5 11 20 table-lookup 4 0 6 31 1 3 9 7 32 30 no endspace, not_always 5 9 8 62 35 no endspace, not_always, no empty 6 9 9 97 35 no empty 7 9 10 132 35 no endspace, not_always, no empty 6 9 11 167 4 zerofill(1) 2 9 12 171 16 no endspace, not_always, no empty 5 9 13 187 35 no endspace, not_always, no empty 6 9 14 222 4 zerofill(1) 2 9 15 226 16 no endspace, not_always, no empty 5 9 16 242 20 no endspace, not_always 8 9 17 262 20 no endspace, no empty 8 9 18 282 20 no endspace, no empty 5 9 19 302 30 no endspace, no empty 6 9 20 332 4 always zero 2 9 21 336 4 always zero 2 9 22 340 1 3 9 23 341 8 table-lookup 9 0 24 349 8 table-lookup 10 0 25 357 8 always zero 2 9 26 365 2 2 9 27 367 2 no zeros, zerofill(1) 2 9 28 369 4 no zeros, zerofill(1) 2 9 29 373 4 table-lookup 11 0 30 377 1 3 9 31 378 2 no zeros, zerofill(1) 2 9 32 380 8 no zeros 2 9 33 388 4 always zero 2 9 34 392 4 table-lookup 12 0 35 396 4 no zeros, zerofill(1) 13 9 36 400 4 no zeros, zerofill(1) 2 9 37 404 1 2 9 38 405 4 no zeros 2 9 39 409 4 always zero 2 9 40 413 4 no zeros 2 9 41 417 4 always zero 2 9 42 421 4 no zeros 2 9 43 425 4 always zero 2 9 44 429 20 no empty 3 9 45 449 30 no empty 3 9 46 479 1 14 4 47 480 1 14 4 48 481 79 no endspace, no empty 15 9 49 560 79 no empty 2 9 50 639 79 no empty 2 9 51 718 79 no endspace 16 9 52 797 8 no empty 2 9 53 805 1 17 1 54 806 1 3 9 55 807 20 no empty 3 9 56 827 4 no zeros, zerofill(2) 2 9 57 831 4 no zeros, zerofill(1) 2 9
以下、myisampack によって出力される情報について説明します。
normal
パックが使用されなかったカラムの数。
empty-space
値が空白スペースのみのカラムの数。これらは 1 ビットになる。
empty-zero
値がバイナリの 0 のみのカラムの数。これらは 1 ビットになる。
empty-fill
整数カラムで、その型の全バイト範囲を占めていないカラムの数。これらは、より小さな型に変換される(たとえば、INTEGER カラムを MEDIUMINT に変更する)。
pre-space
数値カラムのうち、値の先頭に空白スペースがあるカラムの数。この場合、各値には先頭スペースのカウントが含まれる。
end-space
末尾に空白スペースがあるカラムの数。この場合、各値には末尾スペースのカウントが含まれる。
table-lookup
カラムに複数の値が少ししかなく、ハフマン圧縮の前に ENUM に変換された。
zero
すべての値がゼロであるカラムの数。
Original trees
ハフマンツリーの初期番号。
After join
領域を節約するためにツリーを結合した後に残った、独立したハフマンツリーの数。
テーブルが圧縮された後で myisamchk -dvv を実行すると、各フィールドについての以下の追加情報が出力されます。
Type
フィールド型には以下の記述子が入る。
constant
すべてのレコードが同じ値。
no endspace
エンドスペースを保存しない。
no endspace, not_always
エンドスペースを保存せず、すべての値でエンドスペース圧縮を実行しない。
no endspace, no empty
エンドスペースを保存しない。空白値を保存しない。
table-lookup
カラムが ENUM に変換された。
zerofill(n)
値内の最も重要な n バイトは常に 0 なので、保存しない。
no zeros
ゼロを保存しない。
always zero
0 値を 1 ビットで保存する。
Huff tree
フィールドに関連付けられているハフマンツリー。
Bits
ハフマンツリーで使用されているビット数。
pack_isam または myisampack を実行後、isamchk または myisamchk を実行してインデックスを再生成する必要があります。このとき、MySQL オプティマイザの効率性を上げるために、インデックスブロックをソートし、統計を作成しておくこともできます。
myisamchk -rq --analyze --sort-index table_name.MYI isamchk -rq --analyze --sort-index table_name.ISM
パックされたテーブルを MySQL データベースディレクトリにインストールした後、mysqladmin flush-tables を実行して、mysqld が新しいテーブルを使用して起動するようにしてください。
パックされたテーブルをアンパックするには、--unpack オプションで isamchk または myisamchk を実行します。
© 1995-2005 MySQL AB. All rights reserved.
