使用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 生成的信息类型解释如下:
- “Keyfile” 是指索引文件。
- “Record” 和 “row” 是同义词,“field” 和 “column” 也是同义词。
- 表描述的初始部分包含以下值:
- 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
- 每行占用的空间,以字节为单位。
- MyISAM 文件
- 表描述部分的输出包括表中所有键的列表。对于每个键,myisamchk 显示一些低级信息:
- Key
- 此键的数字。仅显示第一个列的键值。如果此值为空,则该行对应于多个列键的第二个或以后列。在示例中,有两个表描述行用于第二个索引。这表明它是一个具有两个部分的多重索引。
- Start
- 索引中此部分在行中的开始位置。
- Len
- 此部分索引的长度。对于打包数字,这应该始终是列的完整长度。对于字符串,它可能比索引的完整长度短,因为您可以对字符串列的前缀进行索引。多重部分键的总长度是所有键部分的长度之和。
- Index
- 键值是否可以在索引中多次存在。可能的值是 unique 或 multip。(multiple)
- Type
- 此部分索引的数据类型。这是一个 MyISAM 数据类型,可能的值是 packed、stripped 或 empty。
- Root
- 根索引块的地址。
- Blocksize
- 每个索引块的大小。默认情况下为 1024,但在编译时可以从源构建 MySQL 时更改。
- Rec/key
- 优化器使用的统计值。它告诉每个此索引的值有多少行。唯一索引总是值为 1。如果在加载表后(或发生重大更改后)使用 myisamchk -a 更新此值,则可能会更新。如果从未更新,则默认值为 30。
- Key
- 最后一部分提供有关每个列的信息:
- 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 树及其位数。
- Field
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 输出包含以下信息:
- 数据记录
- 表中的行数。
- 已删除块
- 仍保留空间的已删除块数量。您可以优化表以最小化此空间。
- 键
- 键号。
- 使用的键块
- 使用了多少百分比的键块。当一个表刚刚用myisamchk重新组织时,这些值非常高(非常接近理论最大值)。
- 打包
- MySQL尝试对具有共同后缀的键值进行打包。这只能用于CHAR和VARCHAR列上的索引。对于具有相似左侧部分的长索引字符串,这可以显著减少使用的空格。在上述示例中,第二个键长为40字节,实现了97%的空间节省。
- 最大级别
- 此键的B树深度。具有长键值的大型表会得到较高的值。
- 记录
- 表中的行数。
- M.recordlength
- 平均行长度。这是固定长度行的确切行长度,因为所有行都具有相同的长度。
- 打包
- MySQL从字符串末尾删除空格。Packed值表示通过执行此操作实现的节省百分比。
- 记录空间使用情况
- 数据文件使用了多少百分比。
- 空空间
- 数据文件未使用的百分比。
- 块/记录
- 每行的平均块数(即,一个碎片化行的链接数)。对于固定格式表,此值为1.0。此值应尽可能接近1.0。如果它变得太大,您可以重新组织表。
- 记录块
- 使用了多少个块(链接)。对于固定格式表,这与行数相同。
- 已删除块
- 删除了多少个块(链接)。
- 记录数据
- 数据文件中使用了多少字节。
- 已删除数据
- 数据文件中已删除(未使用)的字节数。
- 丢失的空间
- 如果一行更新为更短的长度,会丢失一些空间。这是所有这些损失的总和,以字节为单位。
- 链接数据
- 当使用动态表格式时,行片段与指针(每个4到7字节)链接。链接数据是所有这些指针存储量的总和。