6.6.4.5 MyISAMmyisamchk内存使用
要获得关于MyISAM表或对其的统计信息,使用以下命令。这些命令的输出在本节后面解释。
参数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
。其他可能的值是Compressed
和Packed
。(Packed
对应于SHOW TABLE STATUS
报告的Dynamic
。) -
字符集
表默认字符集。
-
文件版本
MyISAM 格式的版本。总是为 1。
-
创建时间
数据文件创建的时间。
-
恢复时间
索引/数据文件最后重建的时间。
-
状态
表状态标志。可能的值是
crashed
、open
、changed
、analyzed
、optimized keys
和sorted index pages
。 -
Auto increment key
、Last 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
索引中是否可以存在多个相同的键值。可能的值是
unique
或multip.
(multiple)。 -
Type
索引部分的数据类型。这是一个
MyISAM
数据类型,可能的值是packed
、stripped
或empty
。 -
Root
索引根块的地址。
-
Blocksize
每个索引块的大小。默认情况下,这是 1024,但可以在编译时更改,以便在源代码中构建 MySQL。
-
Rec/Key
优化器使用的统计值,它告诉索引中每个值对应的行数。唯一索引总是有一个值为 1 的。这可能在表加载(或大幅更改)后更新,以使用 myisamchk -a。如果没有更新,这将给出一个默认值 30。
输出的最后一部分提供了每个列的信息:
-
Field
列号。
-
Start
表行中的列起始位置(以字节为单位)。
-
Length
列的长度(以字节为单位)。
-
Nullpos
、Nullbit
对于可以为空的列,
MyISAM
将空值存储为一个标志在一个字节中。根据nullable列的数量,可以使用一个或多个字节来实现这个目的。Nullpos
和Nullbit
值,如果非空,表示该字节和位包含该标志,指示该列是否为空。存储空值标志的位置和字节数在字段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 tree
和 Bits
字段将被显示。请参阅第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 尝试将具有共同后缀的键值打包。这只能用于
CHAR
和VARCHAR
列的索引。对于长的带索引字符串,如果这些字符串具有相似的左侧部分,这可以显著减少空间使用。在前面的示例中,第二个键是 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
是所有这些指针所占用的存储空间总和。