Documentation Home

4.6.4.5 用myisamchk获取表信息

要获取MyISAM表的描述或有关它的统计信息,请使用此处显示的命令。这些命令的输出将在本节后面解释。

  • myisamchk -d tbl_name

    描述模式 运行myisamchk以生成表的描述。如果在禁用外部锁定的情况下启动 MySQL 服务器, myisamchk可能会报告在运行时更新的表的错误。但是,因为 myisamchk在describe模式下不改变表,所以不存在破坏数据的风险。

  • myisamchk -dv tbl_name

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

  • myisamchk -eis tbl_name

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

  • myisamchk -eiv tbl_name

    这就像-eis, 但告诉你正在做什么。

tbl_name参数可以是表 的MyISAM名称或其索引文件的名称,如第 4.6.4 节“myisamchk — MyISAM 表维护实用程序”中所述。tbl_name可以给出 多个参数。

假设名为的表person具有以下结构。(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;

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

-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. 其他可能的值是CompressedPacked。(Packed 对应于SHOW TABLE STATUS 报告的内容Dynamic。)

  • Chararacter set

    表默认字符集。

  • File-version

    格式的版本MyISAM。总是 1。

  • Creation time

    创建数据文件的时间。

  • Recover time

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

  • Status

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

  • Auto increment key,Last value

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

  • Data records

    表中的行数。

  • Deleted blocks

    有多少已删除的块仍有保留空间。您可以优化表以最小化此空间。请参阅 第 7.6.4 节,“MyISAM 表优化”

  • Datafile parts

    对于动态行格式,这表示有多少数据块。对于没有碎片行的优化表,这与Data records.

  • 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

    这把钥匙的号码。此值仅针对键的第一列显示。如果缺少此值,则该行对应于多列键的第二列或后面的列。对于示例中显示的表,第二个索引有两table description行。这表明它是一个包含两个部分的多部分索引。

  • Start

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

  • Len

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

  • Index

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

  • Type

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

  • Root

    根索引块的地址。

  • Blocksize

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

  • Rec/key

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

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

  • Field

    列号。

  • Start

    列在表行中的字节位置。

  • Length

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

  • Nullpos,Nullbit

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

    用于存储 NULL标志的位置和字节数显示在字段 1 的行中。这就是为什么该表有六Field行,person即使它只有五列。

  • Type

    数据类型。该值可能包含以下任何描述符:

    • 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

    霍夫曼树中使用的位数。

如果表已使用 myisampack压缩,则 显示Huff tree和字段。有关此信息的示例, 请参阅第 4.6.6 节“myisampack — 生成压缩的只读 MyISAM 表” 。Bits

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 尝试打包具有共同后缀的键值。这只能用于 CHARVARCHAR列的索引。对于具有相似最左边部分的长索引字符串,这可以显着减少使用的空间。在前面的示例中,第二个密钥的长度为 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是所有此类指针使用的存储量的总和。