Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  myisampack — 圧縮された読み取り専用の MyISAM テーブルの生成

4.6.5 myisampack — 圧縮された読み取り専用の MyISAM テーブルの生成

myisampack ユーティリティーは MyISAM テーブルを圧縮します。myisampack は、テーブルの各カラムを独立して圧縮することによって機能します。通常、myisampack はデータファイルを 40% から 70% パックします。

テーブルがあとで使用される場合、カラムの解凍に必要な情報をサーバーがメモリー内に読み取ります。これにより、個々の行をアクセスする際のパフォーマンスが大幅に向上します。これは、圧縮解除しなければならないのは 1 つの行のみであるためです。

MySQL は、圧縮されたテーブルでメモリーのマッピングを行う場合に、可能であれば mmap() を使用します。mmap() が機能しない場合、MySQL は普通のファイル読み取り/書き込み操作に戻ります。

次の点に注意してください。

  • mysqld サーバーが外部ロックが無効化された状態で起動された場合、パック処理の最中にサーバーによってテーブルが更新される可能性がある場合は、myisampack の起動は推奨されません。サーバーが停止している状態でテーブルを圧縮するのがもっとも安全です。

  • テーブルは、パック後に読み取り専用になります。通常これは意図されたものです (CD 内のパックされたテーブルにアクセスする場合など)。

  • myisampack はパーティション化されたテーブルをサポートしません。

myisampack は次のように起動します。

shell> myisampack [options] file_name ...

各ファイル名引数はインデックス (.MYI) ファイルの名前にしてください。データベースディレクトリ内にいない場合、ファイルへのパスを指定するようにしてください。.MYI 拡張子は省略可能です。

myisampack でテーブルを圧縮したら、myisamchk -rq を使用してインデックスを再構築するようにしてください。セクション4.6.3「myisamchk — MyISAM テーブルメンテナンスユーティリティー」

myisampack は次のオプションをサポートします。また、オプションファイルを読み取り、セクション4.2.7「オプションファイルの処理に影響するコマンド行オプション」に説明されている、それらを処理するためのオプションもサポートします。

  • --help, -?

    ヘルプメッセージを表示して終了します。

  • --backup, -b

    tbl_name.OLD という名前を使用して、各テーブルのデータファイルのバックアップを作成します。

  • --character-sets-dir=path

    文字セットがインストールされているディレクトリ。セクション10.5「文字セットの構成」を参照してください。

  • --debug[=debug_options], -# [debug_options]

    デバッグのログを書き込みます。一般的な debug_options 文字列は d:t:o,file_name です。デフォルトは d:t:o です。

  • --force, -f

    パックされたテーブルが元のテーブルより大きくなる場合や、以前に myisampack を呼び出した際の中間ファイルが存在する場合でも、パックされたテーブルを生成します (myisampack はテーブルの圧縮中に、 tbl_name.TMD という名前の中間ファイルをデータベースディレクトリに作成します。myisampack を強制終了した場合、.TMD ファイルは削除されないことがあります。)通常、myisampacktbl_name.TMD が存在することを検出すると、エラーで終了します。--force を使用すると、myisampack は必ずテーブルをパックします。

  • --join=big_tbl_name, -j big_tbl_name

    コマンド行で指名されたすべてのテーブルを、単一のパックされたテーブル big_tbl_name に結合します。結合されるすべてのテーブルは、必ずまったく同一の構造でなければなりません (同一カラム名、型、同一インデックスなど)。

    結合操作の前に、big_tbl_name が存在していなければなりません。コマンド行で指名され big_tbl_name にマージされるすべてのソーステーブルが存在していなければなりません。ソースのテーブルは結合のために読み取られますが、変更はされません。この結合操作では、big_tbl_name.frm ファイルは作成されないので、結合操作の完了後、.frm ファイルをソーステーブルの 1 つからコピーして big_tbl_name.frm と名付けます。

  • --silent, -s

    サイレントモード。エラーが発生したときのみ出力を書き出します。

  • --test, -t

    実際にテーブルをパックせず、パックのテストのみを実行します。

  • --tmpdir=path, -T path

    指名されたディレクトリを、myisampack が一時ファイルを作成する場所として使用します。

  • --verbose, -v

    冗長モード。パック操作の進行状況とその結果に関する情報を書き込みます。

  • --version, -V

    バージョン情報を表示して終了します。

  • --wait, -w

    テーブルが使用中の場合、待機してから再度試みます。mysqld サーバーが外部ロックが無効化された状態で起動された場合、パック処理の最中にサーバーによってテーブルが更新される可能性がある場合は、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%
Remember to run myisamchk -rq on compressed tables

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
Datafile pointer (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

    バイナリのゼロのみの値を含むカラムの数。これらは 1 ビットを占めます。

  • empty-fill

    それぞれの型のバイト範囲をすべて占領しない整数カラムの数。これらはより小さい型に変更されます。たとえば、BIGINT カラム (8 バイト) のすべての値が -128 から 127 の範囲内にある場合は、このカラムを TINYINT カラム (1 バイト) として格納できます。

  • pre-space

    先頭にスペースが付いて保存されている 10 進数カラムの数。この場合、各値は先頭のスペースの数のカウントを含んでいます。

  • end-space

    後続のスペースを多く含むカラムの数。この場合、各値は後続のスペースの数のカウントを含んでいます。

  • table-lookup

    カラムには少数の異なる値のみがあり、ハフマン圧縮の前に ENUM に変換されました。

  • zero

    すべての値がゼロのカラムの数。

  • Original trees

    もともとのハフマンツリーの数です。

  • After join

    ヘッダースペースを節約するため、ツリーの結合のあとに残った異なるハフマンツリーの数。

テーブルの圧縮後、myisamchk -dvv が表示する Field 行には、各カラムに関する追加情報が含まれます。

  • Type

    データ型。この値は次のいずれかのディスクリプタを含むことがあります。

    • constant

      すべての行は同じ値を持っています。

    • no endspace

      エンドスペースを保存しません。

    • no endspace, not_always

      エンドスペースを保存せず、またすべての値にエンドスペース圧縮を行いません。

    • no endspace, no empty

      エンドスペースを保存しません。空の値を保存しません。

    • table-lookup

      カラムは ENUM に変換されました。

    • zerofill(N)

      値の中の最上位の N バイトは常に 0 であり、保存されません。

    • no zeros

      ゼロを保存しません。

    • always zero

      ゼロ値は 1 ビットを使用して保存されます。

  • Huff tree

    カラムに関連しているハフマンツリーの数。

  • Bits

    ハフマンツリーで使用されているビット数。

myisampack の起動後、インデックスを再作成するにはmyisamchk を起動しなければいけません。このとき、MySQL オプティマイザの動作効率化を図るために、インデックスブロックのソートと統計の作成を行うことができます。

shell> myisamchk -rq --sort-index --analyze tbl_name.MYI

パックされたテーブルを MySQL データベースディレクトリにインストールしたあと、mysqld が新しいテーブルを使用することを強制するため、mysqladmin flush-tables を実行するようにしてください。

パックされたテーブルをアンパックするには、myisamchk に対して --unpack オプションを使用してください。


User Comments
  Posted by Jim Grill on May 3, 2005
To see if a table is, in fact, compressed and that MySQL is using the compressed table, issue the following query:

mysql> SHOW TABLE STATUS FROM dbname LIKE 'tableName'\G

The results will be similar to the following:

*************************** 1. row ***************************
Name: tableName
Engine: MyISAM
Version: 9
Row_format: Compressed
Rows: 8887
Avg_row_length: 13
Data_length: 120476
Max_data_length: 4294967295
Index_length: 329728
Data_free: 0
Auto_increment: 21657
Create_time: 2005-04-29 12:24:35
Update_time: 2005-04-29 12:24:41
Check_time: 2005-05-02 14:40:13
Collation: latin1_swedish_ci
Checksum: 2854389546
Create_options:
Comment:
1 row in set (0.72 sec)

Notice the Row_format is shown as "Compressed".

If you do not see "Compressed" as the Row_format try issuing a "FLUSH TABLE tableName;" to force MySQL to reload the table and try again.
  Posted by Jim Grill on May 6, 2005
It seems there are some particular issues regarding "show table status" with compressed tables on a working server.

After further experimentation and some help from mysql support, it seems that the best method for compressing tables on a working database (even if you know the table will not be used during the process) is to first obtain a lock via a mysql client program and then flush the table. While leaving your client program connected and holding the lock, use the myisampack and myisamchk utilities per the above documentation.

When complete, release the lock and flush the table again.

Always do issue a "show table status..." and check the "Row_format" field. The Row_format should be "Compressed". If your table still shows something other than "Compressed" as the Row_format or if you are getting erroneous data from selects try issuing a "flush tables" statement.

Hope that helps. Have fun!
  Posted by J Jorgenson on January 23, 2008
Beware that packing a table while the database is running can lead to data corruption, and is unsupported by MySQL AB. However I've been able to successfully pack 100s of tables on a running database with only a minor warning in the end result. The minor warning is result from the table not being closed.

How to pack a table on a 'live' system:
step 1: LOCK TABLE x FOR WRITE;
step 2: FLUSH TABLE x;
step 3: myisamchk -cFU -- fast check for pre-existing errors. Don't pack if errors exist. Ignore the warning of table "not closed" because this check will go ahead and closed the DB files.
step 4: myisampack -f -- force overwrite of any preexisting .TMD file
step 5: myisamchk -raqS -- rebuild the index after pack
step 6: FLUSH TABLE x; -- force reload of info_schema data
step 7: UNLOCK TABLES; -- Release the table.

Ultimatly the results of table packing is to trade the bottleneck of Disk i/o for CPU cycles, by unpacking more records for the same sized block of data. We have reduced tables that take 1G down to 250M with myisampack.

Enjoy!
  Posted by J Jorgenson on January 23, 2008
Details to NOT miss about packed tables:
1) Once you have Packed a MyISAM table is it **READ ONLY**.
You can only Select From or Truncate the table. No updates or Inserts are allowed.
2) The Archive Engine produces a smaller table, it won't have an Index, but new records can still be appended.
3) The DATA is not sorted by myisampack.
4) You must rebuild the index after packing: myisamchk -raqS

I've found the performance gains and disk space savings from packed tables is worth having to rebuilding the data periodically.
I'm looking forward to combine partitioning of packed and unpacked tables for an archival system.

-- JJ --
  Posted by Mark Robson on January 28, 2008
Another important note:

The mmap() behaviour described here is not optional and may cause a 32-bit server to run out of address space sooner than it otherwise would.

Therefore I strongly recommend factoring address space usage into any feasibility study of myisampack on 32-bit systems.
Sign Up Login You must be logged in to post a comment.