要获取 MyISAM
表的描述或统计信息,请使用以下命令。这些命令的输出将在本节后面解释。
参数 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” 指的是索引文件。“Record” 和 “row” 是同义词,如同 “field” 和 “column.”
表描述的初始部分包含以下值:
-
MyISAM 文件
MyISAM(索引)文件的名称。
-
记录格式
用于存储表行的格式。前面的示例使用
Fixed length
。其他可能的值是Compressed
和Packed
。(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
值的总和。 -
索引
该键值是否可以在索引中多次出现。可能的值是
unique
或multip.
(多个)。 -
类型
该索引部分的数据类型。这是一个
MyISAM
数据类型,可能的值是packed
、stripped
或empty
。 -
根
根索引块的地址。
-
块大小
每个索引块的大小。默认情况下这是 1024,但可以在编译 MySQL 源代码时更改该值。
-
记录/键
这是一个统计值,用于优化器。它告诉每个索引值对应多少行。唯一索引总是具有 1 的值。该值可能在表加载(或大幅更改)后更新,以 myisamchk -a。如果该值从不更新,默认值为 30。
输出的最后一部分提供了每列的信息:
-
字段
列号。
-
开始
该列在表行中的字节位置。
-
长度
该列的字节长度。
-
Nullpos
、Nullbit
对于可以为空的列,
MyISAM
将空值存储为字节中的一个标志。根据可为空的列的数量,可以使用一个或多个字节来存储这些标志。Nullpos
和Nullbit
值,如果非空,指示哪个字节和位包含该标志,表明该列是否为空。存储空标志的位置和字节数在第一个字段的行中显示。这就是为什么五列的
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 尝试将具有共同后缀的键值打包。这只能用于
CHAR
和VARCHAR
列的索引。对于具有相似左侧部分的长索引字符串,可以显著减少空间使用。在上面的示例中,第二个键为 40 字节长,实现了 97% 的空间减少。 -
最大级别
该键的 B 树的深度。大表具有长键值的表将获得高值。
-
记录
表中的行数。
-
M.记录长度
平均行长度。这是固定长度行表的确切行长度,因为所有行都具有相同的长度。
-
打包
MySQL 从字符串末尾删除空格。
打包
值指示了通过这样做所获得的百分比节省。 -
记录空间使用
数据文件的使用百分比。
-
空闲空间
数据文件的未使用百分比。
-
块/记录
每行的平均块数(即,一个碎片行是由多少个链接组成的)。对于固定格式的表,这个值总是 1.0。如果这个值变得太大,可以重新组织表。参见第 9.6.4 节,“MyISAM 表优化”。
-
记录块
使用了多少个块(链接)。对于固定格式的表,这与行数相同。
-
删除块
删除了多少个块(链接)。
-
记录数据
数据文件中使用了多少字节。
-
已删除数据
数据文件中未使用的字节数。
-
浪费的空间
如果一行更新为较短的长度,一些空间将被浪费。这是所有这种损失的总和,以字节为单位。
-
链接数据
当使用动态表格式时,行碎片使用指针(每个 4 到 7 字节)链接。
链接数据
是所有这些指针所使用的存储总和。