4.6.3.5 通过 myisamchk 获取 table 信息

要获取MyISAMtable 的描述或有关它的统计信息,请使用此处显示的命令。这些命令的输出将在本节稍后说明。

在“描述模式”下运行myisamchk以生成 table 的描述。如果您在禁用外部锁定的情况下启动 MySQL 服务器,则myisamchk可能会报告 table 在运行时更新的错误。但是,由于myisamchk不会在描述模式下更改 table,因此没有破坏数据的风险。

添加-v将以详细模式运行myisamchk,以便它生成有关该 table 的更多信息。第二次加上-v会产生更多信息。

仅显示 table 格中最重要的信息。此操作很慢,因为它必须读取整个 table。

就像-eis,但是告诉您正在做什么。

假设名为person的 table 具有以下结构。 (包含MAX_ROWS table 选项,以便在稍后显示的myisamchk的示例输出中,某些值更小并且更容易适应输出格式。)

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;

还假设该 table 具有以下数据和索引文件大小:

-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:       latin1_swedish_ci (8)
File-version:        1
Creation time:       2009-08-19 16:47:41
Recover time:        2009-08-19 16:47:56
Status:              checked,analyzed,optimized keys
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        99328       1024
2   6     20  multip. varchar prefix           512      3563520       1024
    27    20          varchar                  512
3   48    3   multip. uint24 NULL           306688      6065152       1024

Field Start Length Nullpos Nullbit Type
1     1     1
2     2     4                      no zeros
3     6     21                     varchar
4     27    21                     varchar
5     48    3      1       1       no zeros
6     51    3      1       2       no zeros

myisamchk产生的信息类型的说明在此处给出。 “密钥文件”是指索引文件。 “记录”和“行”同义,“字段”和“列”同义。

table 描述的初始部分包含以下值:

  • MyISAM file

MyISAM(索引)文件的名称。

  • Record format

用于存储 table 行的格式。前面的示例使用Fixed length。其他可能的值为CompressedPacked。 (Packed对应于SHOW TABLE STATUS报告为Dynamic.)

  • Chararacter set

table 的默认字符集。

  • File-version

MyISAM格式的版本。总是 1.

  • Creation time

创建数据文件的时间。

  • Recover time

上次重建索引/数据文件的时间。

  • Status

table 状态标志。可能的值为crashedopenchangedanalyzedoptimized keyssorted index pages

  • Auto increment key , Last value

与 table 的AUTO_INCREMENT列关联的键号,以及该列的最新生成的值。如果没有这样的列,则不会出现这些字段。

  • Data records

table 中的行数。

  • Deleted blocks

多少个删除的块仍具有保留空间。您可以优化 table 以最小化此空间。参见第 7.6.4 节“ MyISAMtable 优化”

  • Datafile parts

对于动态行格式,这 table 明有多少个数据块。对于没有碎片行的优化 table,此名称与Data records相同。

  • Deleted data

有多少字节的未回收删除数据。您可以优化 table 以最小化此空间。参见第 7.6.4 节“ MyISAMtable 优化”

  • Datafile pointer

数据文件指针的大小,以字节为单位。通常为 2、3、4 或 5 个字节。大多数 table 使用 2 个字节进行 Management,但这尚不能通过 MySQL 进行控制。对于固定 table,这是行地址。对于动态 table,这是一个字节地址。

  • Keyfile pointer

索引文件指针的大小,以字节为单位。通常为 1、2 或 3 个字节。大多数 tableManagement2 个字节,但这是由 MySQL 自动计算的。它始终是一个块地址。

  • Max datafile length

table 数据文件可以变为多长时间(以字节为单位)。

  • Max keyfile length

table 索引文件可以变成多长时间(以字节为单位)。

  • Recordlength

每行占用多少空间,以字节为单位。

输出的table description部分包括 table 中所有键的列 table。对于每个键,myisamchk显示一些底层信息:

  • Key

此项的 Numbers。仅在键的第一列中显示此值。如果缺少此值,则该行对应于多列键的第二列或更高列。对于示例中显示的 table,第二个索引有两条table description行。这 table 明它是一个由两部分组成的 Multipart 索引。

  • Start

索引的该部分在行中的何处开始。

  • Len

这部分索引有多长时间。对于压缩数字,该数字应始终为列的全长。对于字符串,它可能比索引列的全长短,因为您可以索引字符串列的前缀。Multipart 键的总长度是所有键部分的Len值的总和。

  • Index

键值是否可以在索引中多次存在。可能的值为uniquemultip.(多个)。

  • Type

索引的此部分具有什么数据类型。这是MyISAM数据类型,可能的值为packedstrippedempty

  • Root

根索引块的地址。

  • Blocksize

每个索引块的大小。默认情况下,它是 1024,但是当从源代码构建 MySQL 时,该值可以在编译时更改。

  • Rec/key

这是优化器使用的统计值。它告诉该索引每个值有多少行。唯一索引的值始终为 1.可以使用myisamchk -a将 table 加载(或大大更改)后进行更新。如果根本不更新,则默认值为 30.

输出的最后一部分提供有关每一列的信息:

  • Field

列号。

  • Start

table 格行中列的字节位置。

  • Length

列的长度(以字节为单位)。

  • Nullpos , Nullbit

对于可以为NULL的列,MyISAMNULL值作为标志存储在字节中。根据有多少可空列,可以有一个或多个字节用于此目的。 NullposNullbit值(如果为非空),指示哪个字节和位包含 table 示该列是否为NULL的标志。

字段 1 的行中显示了用于存储NULL标志的位置和字节数。这就是为什么persontable 有六个Field行的原因,尽管它只有五列。

  • Type

数据类型。该值可以包含以下任何 Descriptors:

  • constant

所有行都具有相同的值。

  • no endspace

不要存储空格。

  • no endspace, not_always

不要存储所有空格,也不要对所有值进行空格压缩。

  • no endspace, no empty

不要存储空格。不要存储空值。

  • table-lookup

该列已转换为ENUM

  • zerofill(N)

值中的最高有效* N *字节始终为 0,并且不存储。

  • no zeros

不要存储零。

  • always zero

零值使用一位存储。

  • Huff tree

与列关联的霍夫曼树的编号。

  • Bits

霍夫曼树中使用的位数。

如果 table 已使用myisampack压缩,则显示Huff treeBits字段。有关此信息的示例,请参见第 4.6.5 节“ myisampack —生成压缩的只读 MyISAMtable”

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

table 中的行数。

  • Deleted blocks

多少个删除的块仍具有保留空间。您可以优化 table 以最小化此空间。参见第 7.6.4 节“ MyISAMtable 优化”

  • Key

密钥号。

  • Keyblocks used

使用了多少百分比的键块。当刚刚用myisamchk重组 table 时,值非常高(非常接近理论最大值)。

  • Packed

MySQL 尝试打包具有共同后缀的键值。仅可用于CHARVARCHAR列上的索引。对于具有最左部分相似的长索引字符串,这可以显着减少使用的空间。在前面的示例中,第二个密钥的长度为 40 个字节,并且空间减少了 97%。

  • Max levels

此键的 B 树有多深。具有长键值的大型 table 将获得较高的值。

  • Records

table 中有多少行。

  • M.recordlength

平均行长。这是具有固定长度行的 table 的确切行长度,因为所有行的长度都相同。

  • Packed

MySQL 从字符串末尾去除空格。 Packed值 table 示通过执行此操作所节省的百分比。

  • Recordspace used

使用了多少百分比的数据文件。

  • Empty space

数据文件的未使用百分比。

  • Blocks/Record

每行的平均块数(即,一个分散的行由多少个链接组成)。对于固定格式的 table,该值始终为 1.0. 该值应保持尽可能接近 1.0. 如果它太大,则可以重新组织 table。参见第 7.6.4 节“ MyISAMtable 优化”

  • Recordblocks

使用了多少个块(链接)。对于固定格式的 table,此数目与行数相同。

  • Deleteblocks

删除了多少个块(链接)。

  • Recorddata

数据文件中使用了多少字节。

  • Deleted data

删除(未使用)数据文件中的多少字节。

  • Lost space

如果将一行更新为较短的长度,则会丢失一些空间。这是所有此类损失的总和,以字节为单位。

  • Linkdata

使用动态 table 格式时,行片段与指针链接(每个指针 4 到 7 个字节)。 Linkdata是所有此类指针使用的存储量的总和。