使用myisamchk获取表信息

来自泡泡学习笔记
BrainBs讨论 | 贡献2023年12月25日 (一) 09:52的版本 (创建页面,内容为“ 要获取MyISAM表的描述或统计信息,可以使用以下命令。 <br> <pre>myisamchk -d tbl_name</pre> 以“描述模式”运行myisamchk以生成表的描述。如果启动MySQL服务器时禁用了外部锁定,myisamchk可能在运行过程中报告表的错误。然而,由于myisamchk在描述模式下不会更改表,因此没有破坏数据的风险。 <br> <pre>myisamchk -dv tbl_name</pre> 添加-v运行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表的名称或其索引文件的名称。可以给出多个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 生成的信息类型解释如下:

  1. “Keyfile” 是指索引文件。
  2. “Record” 和 “row” 是同义词,“field” 和 “column” 也是同义词。
  3. 表描述的初始部分包含以下值:
    • MyISAM 文件
      • MyISAM(索引)文件的名称。
    • Record format
      • 用于存储表行的格式。前面的示例使用固定长度。其他可能的值是压缩和打包。(Packed 对应于 SHOW TABLE STATUS 报告为动态的情况。)
    • Chararacter set
      • 表的默认字符集。
    • File-version
      • MyISAM 格式的版本。总是 1。
    • Creation time
      • 数据文件创建的时间。
    • Recover time
      • 索引/数据文件上次重建的时间。
    • Status
      • 表状态标志。可能的值有崩溃、打开、已更改、分析、优化键和排序索引页面。
    • Auto increment key, Last value
      • 与表的 AUTO_INCREMENT 列关联的键号,以及此列最近生成的值。如果没有这样的列,这些字段将不显示。
    • Data records
      • 表中的行数。
    • Deleted blocks
      • 仍有保留空间的已删除块的数量。您可以优化表以最小化此空间。
    • Datafile parts
      • 对于动态行格式,这表示有多少个数据块。对于没有碎片行的优化表,这与 Data records 相同。
    • Deleted data
      • 未回收的已删除数据的字节数。您可以优化表以最小化此空间。
    • Datafile pointer
      • 数据文件指针的大小,以字节为单位。通常为 2、3、4 或 5 字节。大多数表管理 2 字节,但无法从 MySQL 控制。对于固定表,这是行地址。对于动态表,这是字节地址。
    • Keyfile pointer
      • 索引文件指针的大小,以字节为单位。通常为 1、2 或 3 字节。大多数表管理 2 字节,但这由 MySQL 自动计算。它总是一个块地址。
    • Max datafile length
      • 表数据文件可以变得多长,以字节为单位。
    • Max keyfile length
      • 表索引文件可以变得多长,以字节为单位。
    • Recordlength
      • 每行占用的空间,以字节为单位。
  4. 表描述部分的输出包括表中所有键的列表。对于每个键,myisamchk 显示一些低级信息:
    • Key
      • 此键的数字。仅显示第一个列的键值。如果此值为空,则该行对应于多个列键的第二个或以后列。在示例中,有两个表描述行用于第二个索引。这表明它是一个具有两个部分的多重索引。
    • Start
      • 索引中此部分在行中的开始位置。
    • Len
      • 此部分索引的长度。对于打包数字,这应该始终是列的完整长度。对于字符串,它可能比索引的完整长度短,因为您可以对字符串列的前缀进行索引。多重部分键的总长度是所有键部分的长度之和。
    • Index
      • 键值是否可以在索引中多次存在。可能的值是 unique 或 multip。(multiple)
    • Type
      • 此部分索引的数据类型。这是一个 MyISAM 数据类型,可能的值是 packed、stripped 或 empty。
    • Root
      • 根索引块的地址。
    • Blocksize
      • 每个索引块的大小。默认情况下为 1024,但在编译时可以从源构建 MySQL 时更改。
    • Rec/key
      • 优化器使用的统计值。它告诉每个此索引的值有多少行。唯一索引总是值为 1。如果在加载表后(或发生重大更改后)使用 myisamchk -a 更新此值,则可能会更新。如果从未更新,则默认值为 30。
  5. 最后一部分提供有关每个列的信息:
    • Field
      • 列号。
    • Start
      • 列在表行中的字节位置。
    • Length
      • 列的长度,以字节为单位。
    • Nullpos, Nullbit
      • 对于可以 NULL 的列,MyISAM 将 NULL 值作为字节中的标记存储。根据可容纳的 NULL 列数量,可以有一个或多个字节用于此目的。如果非空,Nullpos 和 Nullbit 值指示哪个字节和位包含表示列是否为 NULL 的标志。
    • 位置和用于存储 NULL 标志的字节数显示在第 field 行中。这就是为什么对于只有五个列的人表,有六个 Field 行的原因。
    • Type
      • 数据类型。值可能包含以下描述符之一:constant、no endspace、no endspace, not_always、no endspace, no empty、table-lookup、zerofill(N)、no zeros、always zero、Huff tree、Bits。
    • Huff tree and Bits fields 如果表使用 myisampack 压缩,则会显示 Huffman 树及其位数。


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 输出包含以下信息:

  1. 数据记录
    • 表中的行数。
  2. 已删除块
    • 仍保留空间的已删除块数量。您可以优化表以最小化此空间。
    • 键号。
  3. 使用的键块
    • 使用了多少百分比的键块。当一个表刚刚用myisamchk重新组织时,这些值非常高(非常接近理论最大值)。
  4. 打包
    • MySQL尝试对具有共同后缀的键值进行打包。这只能用于CHAR和VARCHAR列上的索引。对于具有相似左侧部分的长索引字符串,这可以显著减少使用的空格。在上述示例中,第二个键长为40字节,实现了97%的空间节省。
  5. 最大级别
    • 此键的B树深度。具有长键值的大型表会得到较高的值。
  6. 记录
    • 表中的行数。
  7. M.recordlength
    • 平均行长度。这是固定长度行的确切行长度,因为所有行都具有相同的长度。
  8. 打包
    • MySQL从字符串末尾删除空格。Packed值表示通过执行此操作实现的节省百分比。
  9. 记录空间使用情况
    • 数据文件使用了多少百分比。
  10. 空空间
    • 数据文件未使用的百分比。
  11. 块/记录
    • 每行的平均块数(即,一个碎片化行的链接数)。对于固定格式表,此值为1.0。此值应尽可能接近1.0。如果它变得太大,您可以重新组织表。
  12. 记录块
    • 使用了多少个块(链接)。对于固定格式表,这与行数相同。
  13. 已删除块
    • 删除了多少个块(链接)。
  14. 记录数据
    • 数据文件中使用了多少字节。
  15. 已删除数据
    • 数据文件中已删除(未使用)的字节数。
  16. 丢失的空间
    • 如果一行更新为更短的长度,会丢失一些空间。这是所有这些损失的总和,以字节为单位。
  17. 链接数据
    • 当使用动态表格式时,行片段与指针(每个4到7字节)链接。链接数据是所有这些指针存储量的总和。