Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

6.6.4.5 使用 myisamchk 获取表信息

要获取 MyISAM 表的描述或统计信息,请使用以下命令。这些命令的输出将在本节后面解释。

  • myisamchk -d tbl_name

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

  • myisamchk -dv tbl_name

    添加 -v 运行 myisamchk 在详细模式下,以生成更多关于表的信息。添加第二个 -v 生成更多信息。

  • myisamchk -eis tbl_name

    仅显示表的最重要信息。这是一个缓慢的操作,因为它必须读取整个表。

  • myisamchk -eiv tbl_name

    这与 -eis 相似,但告诉您正在执行的操作。

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

假设一个名为 person 的表具有以下结构。(MAX_ROWS 表选项用于使示例输出从 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 指的是索引文件。Recordrow 是同义词,如同 fieldcolumn.

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

  • MyISAM 文件

    MyISAM(索引)文件的名称。

  • 记录格式

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

  • 字符集

    表的默认字符集。

  • 文件版本

    MyISAM 格式的版本。始终为 1。

  • 创建时间

    数据文件的创建时间。

  • 恢复时间

    索引/数据文件最后一次重建的时间。

  • 状态

    表状态标志。可能的值是 崩溃打开更改分析优化键排序索引页

  • 自动增量键最后值

    表的 AUTO_INCREMENT 列的键号,以及该列的最新生成值。这些字段仅在存在该列时出现。

  • 数据记录

    表中的行数。

  • 已删除块

    仍保留空间的已删除块数。你可以优化表以最小化该空间。见 第 9.6.4 节,“MyISAM 表优化”

  • 数据文件部分

    对于动态行格式,这表示有多少个数据块。对于优化的表而言,没有碎片行时,这与 数据记录 相同。

  • 已删除数据

    未回收的已删除数据的字节数。你可以优化表以最小化该空间。见 第 9.6.4 节,“MyISAM 表优化”

  • 数据文件指针

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

  • 键文件指针

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

  • 最大数据文件长度

    表数据文件可以达到的最大长度,以字节为单位。

  • 最大键文件长度

    表索引文件可以达到的最大长度,以字节为单位。

  • 记录长度

    每行所占用的空间,以字节为单位。

表描述部分包括表中的所有键的列表:myisamchk 显示每个键的一些低级信息:

  • 该键的编号。该值仅显示在键的第一列中。如果该值不存在,则该行对应于多列键的第二列或后续列。例如,表描述中有两个索引行,表明它是一个多部分索引。

  • 开始

    该索引部分在行中的起始位置。

  • Len

    该索引部分的长度。对于打包数字,总是该列的完整长度。对于字符串,可能短于该索引列的完整长度,因为可以索引字符串列的前缀。多部分键的总长度是所有键部分的 Len 值的总和。

  • 索引

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

  • 类型

    该索引部分的数据类型。这是一个 MyISAM 数据类型,可能的值是 packedstrippedempty

  • 根索引块的地址。

  • 块大小

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

  • 记录/键

    这是一个统计值,用于优化器。它告诉每个索引值对应多少行。唯一索引总是具有 1 的值。该值可能在表加载(或大幅更改)后更新,以 myisamchk -a。如果该值从不更新,默认值为 30。

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

  • 字段

    列号。

  • 开始

    该列在表行中的字节位置。

  • 长度

    该列的字节长度。

  • NullposNullbit

    对于可以为空的列,MyISAM 将空值存储为字节中的一个标志。根据可为空的列的数量,可以使用一个或多个字节来存储这些标志。NullposNullbit 值,如果非空,指示哪个字节和位包含该标志,表明该列是否为空。

    存储空标志的位置和字节数在第一个字段的行中显示。这就是为什么五列的 person 表有六个 Field 行。

  • 类型

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

    • 常量

      所有行都有相同的值。

    • 不存储空格

      不存储空格。

    • 不存储空格,不总是

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

    • 不存储空格,不存储空值

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

    • 表查找

      该列被转换为 ENUM

    • 零填充(N)

      值的最重要的 N 字节总是 0 并且不存储。

    • 不存储零

      不存储零。

    • 总是零

      零值使用一个位存储。

  • Huff 树

    与该列关联的 Huffman 树的编号。

  • Huffman 树中使用的位数。

如果表已使用 myisampack 压缩,则显示 Huff 树 字段。见 第 6.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 输出包括以下信息:

  • 数据记录

    表中的行数。

  • 已删除的块

    仍保留空间的已删除块数。你可以优化表以最小化该空间。见 第 9.6.4 节,“MyISAM 表优化”

  • 键的编号。

  • 键块使用

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

  • 打包

    MySQL 尝试将具有共同后缀的键值打包。这只能用于 CHARVARCHAR 列的索引。对于具有相似左侧部分的长索引字符串,可以显著减少空间使用。在上面的示例中,第二个键为 40 字节长,实现了 97% 的空间减少。

  • 最大级别

    该键的 B 树的深度。大表具有长键值的表将获得高值。

  • 记录

    表中的行数。

  • M.记录长度

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

  • 打包

    MySQL 从字符串末尾删除空格。打包 值指示了通过这样做所获得的百分比节省。

  • 记录空间使用

    数据文件的使用百分比。

  • 空闲空间

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

  • 块/记录

    每行的平均块数(即,一个碎片行是由多少个链接组成的)。对于固定格式的表,这个值总是 1.0。如果这个值变得太大,可以重新组织表。参见第 9.6.4 节,“MyISAM 表优化”

  • 记录块

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

  • 删除块

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

  • 记录数据

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

  • 已删除数据

    数据文件中未使用的字节数。

  • 浪费的空间

    如果一行更新为较短的长度,一些空间将被浪费。这是所有这种损失的总和,以字节为单位。

  • 链接数据

    当使用动态表格式时,行碎片使用指针(每个 4 到 7 字节)链接。链接数据 是所有这些指针所使用的存储总和。