MyISAM
テーブル情報またはそれに関する統計を取得するには、次に示すコマンドを使用します。 これらのコマンドの出力は、このセクションのあとの方で説明します。
-
myisamchk -d
tbl_name
myisamchk を 「describe モード」 で実行し、テーブル情報を生成します。 外部ロックが無効になっている MySQL サーバーを起動した場合には、myisamchk は、実行中に更新があったテーブルに対してエラーをレポートすることがあります。 ただし、describe モードでは myisamchk はテーブルを変更しないため、データが破損される危険はありません。
-
myisamchk -dv
tbl_name
-v
を追加すると、myisamchk は詳細モードで実行され、テーブルについてより多くの情報を生成します。-v
をもう一度使用するとさらに多くの情報が生成されます。 -
myisamchk -eis
tbl_name
テーブルからのもっとも重要な情報のみを表示します。 この操作はテーブル全体を読み取る必要があるため、時間がかかります。
-
myisamchk -eiv
tbl_name
これは
-eis
と同様ですが、進行中の処理が表示されます。
tbl_name
引数は、セクション4.6.4「myisamchk — MyISAM テーブルメンテナンスユーティリティー」で説明するように、MyISAM
テーブルの名前か、またはそのインデックスファイル名のいずれかです。 複数の tbl_name
引数を指定できます。
person
という名前のテーブルの構造が、次のようになっているとします。 (あとに示す myisamchk からの出力例で、一部の値がより小さく、出力形式に適合しやすいように、MAX_ROWS
テーブルオプションが含まれます。)
CREATE TABLE person
(
id INT NOT NULL AUTO_INCREMENT,
last_name VARCHAR(20) NOT NULL,
first_name VARCHAR(20) NOT NULL,
birth DATE,
death DATE,
PRIMARY KEY (id),
INDEX (last_name, first_name),
INDEX (birth)
) MAX_ROWS = 1000000 ENGINE=MYISAM;
また、テーブルのデータファイルおよびインデックスファイルのサイズは次のようになっているとします。
-rw-rw---- 1 mysql mysql 9347072 Aug 19 11:47 person.MYD
-rw-rw---- 1 mysql mysql 6066176 Aug 19 11:47 person.MYI
myisamchk -dvv の出力例:
MyISAM file: person
Record format: Packed
Character set: utf8mb4_0900_ai_ci (255)
File-version: 1
Creation time: 2017-03-30 21:21:30
Status: checked,analyzed,optimized keys,sorted index pages
Auto increment key: 1 Last value: 306688
Data records: 306688 Deleted blocks: 0
Datafile parts: 306688 Deleted data: 0
Datafile pointer (bytes): 4 Keyfile pointer (bytes): 3
Datafile length: 9347072 Keyfile length: 6066176
Max datafile length: 4294967294 Max keyfile length: 17179868159
Recordlength: 54
table description:
Key Start Len Index Type Rec/key Root Blocksize
1 2 4 unique long 1 1024
2 6 80 multip. varchar prefix 0 1024
87 80 varchar 0
3 168 3 multip. uint24 NULL 0 1024
Field Start Length Nullpos Nullbit Type
1 1 1
2 2 4 no zeros
3 6 81 varchar
4 87 81 varchar
5 168 3 1 1 no zeros
6 171 3 1 2 no zeros
myisamchk が生成する情報のタイプについて次に説明します。 「Keyfile」 とはインデックスファイルのことです。 「レコード」と「行」、「フィールド」と 「カラム」は、それぞれシノニムです。
テーブル情報の最初の部分には次の値が含まれます。
-
MyISAM file
MyISAM
(インデックス) ファイルの名前。 -
Record format
テーブルの行を保存するために使用される形式。 前述の例では
Fixed length
を使用しています。 ほかの値には、Compressed
およびPacked
があります。 (Packed
はSHOW TABLE STATUS
レポートでDynamic
とレポートされるものに対応します。) -
Chararacter set
テーブルのデフォルト文字セット。
-
File-version
MyISAM
形式のバージョン。 常に 1。 -
Creation time
いつデータファイルが作成されたか。
-
Recover time
インデックスファイル/データファイルが最後にいつ再構成されたか。
-
Status
テーブルのステータスフラグ。 可能な値は
crashed
、open
、changed
、analyzed
、optimized keys
、およびsorted index pages
です。 -
Auto increment key
、Last value
テーブルの
AUTO_INCREMENT
カラムに関連付けられたキー番号、およびこのカラムに対して直近に生成された値。 そのようなカラムがない場合はこのフィールドは表示されません。 -
Data records
テーブル内の行数。
-
Deleted blocks
削除されたブロックで、スペースがまだ予約されているものの数。 テーブルを最適化してこのスペースを最小化できます。 セクション7.6.4「MyISAM テーブルの最適化」を参照してください。
-
Datafile parts
動的行フォーマットでは、これはデータブロックの数を示します。 断片化レコードがない最適化されたテーブルでは、これは
データレコード
と同じです。 -
Deleted data
未使用の削除されたデータのバイト数。 テーブルを最適化してこのスペースを最小化できます。 セクション7.6.4「MyISAM テーブルの最適化」を参照してください。
-
Datafile pointer
データファイルポインタのサイズ (バイト単位)。 通常は、2、3、4、または 5 バイトです。 ほとんどのテーブルは 2 バイトで対応できますが、これはまだ MySQL では制御できません。 固定テーブルでは、これは行のアドレスです。 動的テーブルでは、これはバイトアドレスです。
-
Keyfile pointer
インデックスファイルポインタのサイズ (バイト単位)。 通常は、1、2、または 3 バイトです。 ほとんどのテーブルは 2 バイトで対応できますが、これは MySQL によって自動的に計算されます。 常にブロックアドレスです。
-
Max datafile length
テーブルデータファイルがどこまで長くなれるか (バイト単位)。
-
Max keyfile length
テーブルインデックスファイルがどこまで長くなれるか (バイト単位)。
-
Recordlength
各行が使用するスペース (バイト単位)。
出力の table description
の部分にはテーブルのすべてのキーのリストが含まれます。 myisamchk は、それぞれのキーについて低レベル情報を表示します。
-
Key
このキーの番号。 この値は、キーの最初のカラムに関してのみ表示されます。 この値が欠落している場合、行は複数カラムキーの 2 番目以降のカラムに対応します。 例に示したテーブルでは、2 番目のインデックスについて 2 つの
table description
行があります。 これは、2 つの部分で構成されるマルチパートインデックスであることを示しています。 -
Start
インデックスのこの部分が行の中のどこで始まるか。
-
Len
インデックスのこの部分の長さ。 パックされた番号では、これは常にカラム全体の長さであるはずです。 文字列では、文字列カラムのプリフィクスにインデックスを付けることができるため、インデックスされるカラム全体の長さより短い場合があります。 マルチパートキーの合計の長さは、すべてのキーパートの
Len
値の合計です。 -
Index
キー値がインデックス内に複数回存在できるかどうか。 可能な値は
unique
またはmultip
(multiple) です。 -
Type
インデックスのこの部分のデータ型。
packed
、stripped
、またはempty
のいずれかの値のMyISAM
データ型です。 -
Root
ルートインデックスブロックのアドレス。
-
Blocksize
各インデックスブロックのサイズ。 デフォルトでは 1024 ですが、この値は MySQL がソースからビルドされる場合はコンパイル時に変更できます。
-
Rec/key
これはオプティマイザによって使用される統計値です。 このインデックスで、値当たりにいくつの行があるかを示します。 一意のインデックスでは値は常に 1 です。 これは、テーブルのロード (または大きな変更) のあとに myisamchk -a で更新される場合があります。 まったく更新されない場合はデフォルト値の 30 が指定されます。
出力の最後の部分は、各カラムの情報を示します。
-
Field
カラム番号。
-
Start
テーブルの行の中でのカラムのバイト位置。
-
Length
カラムの長さ (バイト単位)。
-
Nullpos
、Nullbit
NULL
を取れるカラムでは、MyISAM
はNULL
値をバイト内のフラグとして保存します。 Null にできるカラムがいくつあるかによって、このために使用されるバイトが 1 またはそれ以上ある場合があります。Nullpos
値およびNullbit
値が空でない場合は、カラムがNULL
かどうかを示すフラグが、どのバイトおよびビットに含まれるかを示します。NULL
フラグを保存するために使用される位置とバイト数は、フィールド 1 の行に示されます。person
テーブルには 5 つのカラムしかないのにField
行が 6 個あるのはこのためです。 -
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
ハフマンツリーで使用されているビット数。
Huff tree
フィールドおよび Bits
フィールドは、テーブルが myisampack で圧縮されている場合に表示されます。 この情報の例は、セクション4.6.6「myisampack — 圧縮された読み取り専用の MyISAM テーブルの生成」を参照してください。
myisamchk -eiv の出力例
Checking MyISAM file: person
Data records: 306688 Deleted blocks: 0
- check file-size
- check record delete-chain
No recordlinks
- check key delete-chain
block_size 1024:
- check index reference
- check data record references index: 1
Key: 1: Keyblocks used: 98% Packed: 0% Max levels: 3
- check data record references index: 2
Key: 2: Keyblocks used: 99% Packed: 97% Max levels: 3
- check data record references index: 3
Key: 3: Keyblocks used: 98% Packed: -14% Max levels: 3
Total: Keyblocks used: 98% Packed: 89%
- check records and index references
*** LOTS OF ROW NUMBERS DELETED ***
Records: 306688 M.recordlength: 25 Packed: 83%
Recordspace used: 97% Empty space: 2% Blocks/Record: 1.00
Record blocks: 306688 Delete blocks: 0
Record data: 7934464 Deleted data: 0
Lost space: 256512 Linkdata: 1156096
User time 43.08, System time 1.68
Maximum resident set size 0, Integral resident set size 0
Non-physical pagefaults 0, Physical pagefaults 0, Swaps 0
Blocks in 0 out 7, Messages in 0 out 0, Signals 0
Voluntary context switches 0, Involuntary context switches 0
Maximum memory usage: 1046926 bytes (1023k)
myisamchk -eiv の出力には、次の情報が含まれます。
-
Data records
テーブル内の行数。
-
Deleted blocks
削除されたブロックで、スペースがまだ予約されているものの数。 テーブルを最適化してこのスペースを最小化できます。 セクション7.6.4「MyISAM テーブルの最適化」を参照してください。
-
Key
キー番号。
-
Keyblocks used
キーブロックの何パーセントが使用されているか。 テーブルが myisamchk で再構成されたばかりの場合は、値が非常に高く (理論上の最大値に非常に近く) なります。
-
Packed
MySQL は、共通のサフィクスを持つキー値のパックを試行します。 これは、
CHAR
カラムおよびVARCHAR
カラムのインデックスにのみ使用できます。 左端に同様の部分を持つインデックス付きの長い文字列では、使用されるスペースをこれによって大幅に削減できる場合があります。 前記の例では 2 番目のキーは長さが 40 バイトで、97% のスペース削減が実現されています。 -
Max levels
このキーの B ツリーの深さ。 キー値の長い大規模なテーブルでは値が大きくなります。
-
Records
テーブル内の行数。
-
M.recordlength
平均行長。 固定長の行を持つテーブルではすべての行が同じ長さであるため、これは正確な行の長さです。
-
Packed
MySQL は文字列の最後からスペースを削除します。
Packed
値は、これを行うことによって達成された削減のパーセンテージを示します。 -
Recordspace used
データファイルの何パーセントが使用されているか。
-
Empty space
データファイルの何パーセントが未使用か。
-
Blocks/Record
行当たりの平均ブロック数 (すなわち、断片化された行がいくつのリンクで構成されるか)。 固定形式のテーブルではこの値は常に 1.0 です。 この値はできるだけ 1.0 に近くなるようにしてください。 大きくなりすぎた場合は、テーブルを再構成できます。 セクション7.6.4「MyISAM テーブルの最適化」を参照してください。
-
Recordblocks
使用されているブロック (リンク) の数。 固定形式のテーブルでは、これは行数と同じです。
-
Deleteblocks
削除されたブロック (リンク) の数。
-
Recorddata
データファイル内の使用されているバイト数。
-
Deleted data
データファイル内の削除された (未使用の) バイト数。
-
Lost space
行がより短い長さに更新されると、一部のスペースが失われます。 これは、そのような損失の合計 (バイト単位) です。
-
Linkdata
動的テーブル形式が使用される場合、行の断片はポインタ (それぞれ 4 から 7 バイト) でリンクされます。
Linkdata
は、このようなポインタすべてが使用しているストレージ量の合計です。