官方文档地址:13.7.7.38 SHOW TABLE STATUS Statement
SHOW TABLE STATUS
[{FROM | IN} db_name]
[LIKE 'pattern' | WHERE expr]
SHOW TABLE STATUS
像SHOW TABLES
一样工作,但是提供了关于每个非临时表的大量信息。您还可以使用mysqlshow--status db_name
命令获取此列表。如果有LIKE
子句,则表示要匹配哪些表名。还可以用WHERE
子句使用更通用的条件来选择行,如 26.55 SHOW 语句的扩展 中讨论的那样。
该语句还显示关于视图的信息。
SHOW TABLE STATUS
的输出有以下列:
- Name
表的名称。 - Engine
表的存储引擎。参见 第15章 InnoDB 存储引擎 和 第16章 可供选择的存储引擎。对于分区表,Engine
显示所有分区使用的存储引擎的名称。 - Version
此列未使用。由于 MySQL 8.0 中删除了.frm
文件,该列现在记录的值为硬编码10
,这是 MySQL 5.7 中使用的最后一个.frm
文件版本。 - Row_format
行存储格式(Fixed
固定的、Dynamic
动态的、Compressed
压缩的、Redundant
冗余的、Compact
紧凑的)。对于MyISAM
表,Dynamic
对应于myisamchk -dvv
Packed
记录的内容。 - Rows
行数。一些存储引擎,如MyISAM
,存储精确的计数。对于其他存储引擎,例如InnoDB
,这个值只是一个近似值,可能与实际值相差40%
到50%
。在这种情况下,使用SELECT COUNT(*)
来获得准确的计数。
对于INFORMATION_SCHEMA
表,Rows
值为NULL
。
对于InnoDB
表,行数只是 SQL 优化中使用的粗略估计。(对于InnoDB
分区表,也是这样的。) - Avg_row_length
平均行长。 - Data_length
对于MyISAM
,Data_length
是数据文件的长度,以字节为单位。
对于InnoDB
,Data_length
是为聚集索引分配的大约空间量,以字节为单位。具体来说,它是聚集索引大小(以页为单位)乘以InnoDB
页大小。
有关其他存储引擎的信息,请参见本节末尾的说明。 - Max_data_length
对于MyISAM
,Max_data_length
是数据文件的最大长度。这是给定所使用的数据指针大小,可以存储在表中的数据字节总数。
对于InnoDB
,该列未使用。
有关其他存储引擎的信息,请参见本节末尾的说明。 - Index_length
对于MyISAM
,Index_length
是索引文件的长度,以字节为单位。
对于InnoDB
,Index_length
是为非聚集索引分配的大约空间量,以字节为单位。具体来说,它是非聚集索引大小(以页为单位)乘以InnoDB
页大小。
有关其他存储引擎的信息,请参见本节末尾的说明。 - Data_free
已分配但未使用的字节数。
InnoDB
表会记录该表所属表空间的空闲空间。对于位于共享表空间中的表,这是共享表空间的空闲空间。如果使用多个表空间,并且表有自己的表空间,则空闲空间仅指该表自己表空间的空闲空间。空闲空间是指完全空闲区段减去安全边界的字节数。即使空闲空间显示为0
,只要不需要分配新的区段,就可以插入行。
对于NDB Cluster
,Data_free
显示磁盘上为磁盘数据表或磁盘片段分配但未被使用的空间。(内存中的数据资源使用情况由Data_length
列报告。)
对于分区表,这个值只是一个估计值,可能不是绝对正确的。在这种情况下,更准确的获取此信息的方法是查询INFORMATION_SCHEMA
PARTITIONS
表,如本例所示:
SELECT SUM(DATA_FREE)
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_SCHEMA = 'mydb'
AND TABLE_NAME = 'mytable';
有关更多信息,请参见 26.21 INFORMATION_SCHEMA PARTITIONS 表。
- Auto_increment
下一个AUTO_INCREMENT
值。 - Create_time
创建表的时间。 - Update_time
上次更新数据文件的时间。对于某些存储引擎,该值为NULL
。例如,InnoDB
在其系统表空间中存储多个表,而且不适用数据文件的时间戳。即使在file-per-table
模式下,每个InnoDB
表都在一个单独的.ibd
文件中,更改缓冲区也会延迟对数据文件的写操作,因此文件修改时间与最后一次插入、更新或删除的时间不同。对于MyISAM
,使用数据文件的时间戳;但是,在Windows
上,时间戳不会通过更新来更新,所以值是不准确的。
Update_time
显示在未分区的InnoDB
表上执行的最后一次更新、插入或删除的时间戳值。对于 MVCC,时间戳值反映COMMIT
时间,它被认为是最后一次更新时间。当服务器重新启动或者从InnoDB
数据字典缓存中删除表时,时间戳不会持久。 - Check_time
最后一次检查表的时间。不是所有的存储引擎这次都更新,在这种情况下,该值总是NULL
。对于分区InnoDB
表,Check_time
总是为NULL
。 - Collation
表的默认排序规则。输出不会显式列出表的默认字符集,但排序规则名称以字符集名称开头。 - Checksum
实时校验和值(如果有的话)。 - Create_options
CREATE TABLE
使用的额外选项。
Create_options
显示分区表的分区情况。
在 MySQL 8.0.16 之前,Create_options
显示了在file-per-table
表空间中创建的表指定的ENCRYPTION
子句。从 MySQL 8.0.16 开始,如果表被加密,或者指定的加密不同于模式加密,它将显示针对每个表文件的表空间的ENCRYPTION
子句。对于在一般表空间中创建的表,不会显示ENCRYPTION
子句。要识别加密的每个表文件和普通表空间,查询INNODB_TABLESPACES
ENCRYPTION
列。
当创建严格模式禁用的表时,如果指定的行格式不支持,则使用存储引擎的默认行格式。表的实际行格式在Row_format
列中记录。Create_options
显示在CREATE TABLE
语句中指定的行格式。
在更改表的存储引擎时,表定义中保留不适用于新存储引擎的表选项,以便在必要时将表及其先前定义的选项恢复到原始存储引擎。Create_options
可以显示保留的选项。 - Comment
创建表时使用的注释(或者关于为什么 MySQL 不能访问表信息的信息)。
注意
- 对于
InnoDB
表,除了表预留的物理大小外,SHOW TABLE STATUS
不会给出准确的统计信息。行数只是 SQL 优化中使用的粗略估计。 - 对于
NDB
表,该语句的输出显示了Avg_row_length
和Data_length
列的适当值,但没有考虑BLOB
列。 - 对于
NDB
表,Data_length
只包含主内存中的数据;Max_data_length
和Data_free
列记录的硬盘数据。 - 对于
NDB Cluster
磁盘数据表,Max_data_length
显示为磁盘数据表或片段的磁盘部分分配的空间。(内存中的数据资源使用情况由Data_length
列报告)。 - 对于
MEMORY
表,Data_length
、Max_data_length
和Index_length
值近似于实际分配的内存量。分配算法大量预留内存,减少分配操作次数。 - 对于视图,除了
Name
表示视图名称、Create_time
表示创建时间、Comment
显示VIEW
之外,SHOW TABLE STATUS
显示的大多数列都是0
或NULL
。
还可以从INFORMATION_SCHEMA
TABLES
表中获得表信息。参见 26.38 INFORMATION_SCHEMA TABLES 表。