Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


6.6.4.5 MyISAMmyisamchk内存使用

要获得关于MyISAM表或对其的统计信息,使用以下命令。这些命令的输出在本节后面解释。

  • myisamchk -d tbl_name

    使用myisamchk在“描述模式”中运行,以生成对您的表的描述。如果您使用外部锁定禁用启动MySQL服务器,myisamchk可能会在运行时报告错误,因为该表正在被更新。但是,因为-d模式下myisamchk不更改表,因此没有风险.destroy数据。

  • myisamchk -dv tbl_name

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

  • myisamchk -eis tbl_name

    只显示表的最重要信息。这项操作很慢,因为它必须读取整个表。

  • myisamchk -eiv tbl_name

    这与-eis类似,但告诉你正在进行的操作。

参数tbl_name可以是MyISAM表或其索引文件的名称,详见第6.6.4节,“myisamchk — 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"指的是索引文件."Record"和"row"是同义词,同样 "field" 和 "column"。

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

  • MyISAM 文件

    MyISAM(索引)文件名称。

  • 记录格式

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

  • 字符集

    表默认字符集。

  • 文件版本

    MyISAM 格式的版本。总是为 1。

  • 创建时间

    数据文件创建的时间。

  • 恢复时间

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

  • 状态

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

  • Auto increment keyLast value

    与表的AUTO_INCREMENT列相关联的键号,以及该列最近生成的值。这些字段在没有这种列时不显示。

  • Data records

    表中的行数。

  • Deleted blocks

    删除块中仍保留空间的数量。您可以优化表以最小化该空间。请参阅第9.6.4节,“MyISAM 表优化”

  • Datafile parts

    对于动态行格式,这表示数据块的数量。对于未碎片的优化表,这与Data records相同。

  • Deleted data

    未回收删除数据的字节数量。您可以优化表以最小化该空间。请参阅第9.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

    该索引的长度。对于packed数字,这应该总是列的完整长度。对于字符串,它可能短于indexed列的完整长度,因为可以对字符串列的前缀进行索引。多部分键的总长度是所有key parts的Len值之和。

  • Index

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

  • Type

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

  • Root

    索引根块的地址。

  • Blocksize

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

  • Rec/Key

    优化器使用的统计值,它告诉索引中每个值对应的行数。唯一索引总是有一个值为 1 的。这可能在表加载(或大幅更改)后更新,以使用 myisamchk -a。如果没有更新,这将给出一个默认值 30。

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

  • Field

    列号。

  • Start

    表行中的列起始位置(以字节为单位)。

  • Length

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

  • NullposNullbit

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

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

  • Type

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

    • constant

      所有行都具有相同的值。

    • no endspace

      不要存储结束空格。

    • no endspace, not_always

      不要存储结束空格,并且不对所有值进行结束空格压缩。

    • no endspace, no empty

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

    • table-lookup

      该列被转换为ENUM

    • zerofill(N)

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

    • no zeros

      不要存储零。

    • always zero

      零值使用一个位存储。

  • Huffman树

    与列相关联的 Huffman 树号。

  • Bits

    Huffman 树使用的位数。

如果表已经使用myisampack进行压缩,Huff treeBits 字段将被显示。请参阅第6.6.6节,“myisampack — Generate Compressed, Read-Only MyISAM Tables”,以获取该信息的示例。

myisamchk 命令的示例输出:

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

    已删除的块中保留空间的数量。您可以优化您的表以最小化该空间。请参阅第9.6.4节,“MyISAM Table Optimization”

  • Key

    键号。

  • Keyblocks used

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

  • Packed

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

  • Max levels

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

  • Records

    表中有多少行记录。

  • M.recordlength

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

  • Packed

    MySQL 从字符串末尾删除空格。Packed 值表示通过执行此操作所实现的百分比减少。

  • Recordspace used

    数据文件使用的百分比。

  • Empty space

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

  • Blocks/Record

    行平均块数(即碎片化的行由多少个链接组成)。对于固定格式表,这始终为1.0。这个值应该尽可能地保持在1.0附近。如果它变得太大,可以对表进行重新组织。请参见第9.6.4节,“MyISAM 表优化”

  • Recordblocks

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

  • Deleteblocks

    删除的块(链接)数量。

  • Recorddata

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

  • Deleted data

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

  • Lost space

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

  • Linkdata

    当使用动态表格式时,行片段通过指针(每个4到7个字节)链接。Linkdata 是所有这些指针所占用的存储空间总和。