TABLES表
该TABLES
表提供有关数据库中表的信息。
TABLES
代表表统计信息的列包含缓存的值。该information_schema_stats_expiry
系统变量定义缓存表统计到期之前的一段时间。默认值为86400秒(24小时)。如果没有缓存的统计信息或统计信息已过期,则在查询表统计信息列时将从存储引擎检索统计信息。要随时更新给定表的缓存值,请使用ANALYZE TABLE
。要始终直接从存储引擎检索最新统计信息,请设置information_schema_stats_expiry
为0
。有关更多信息,请参见“优化INFORMATION_SCHEMA查询”。
注意如果
innodb_read_only
启用了系统变量,则ANALYZE TABLE
可能会失败,因为它无法更新使用的数据字典中的统计表InnoDB
。对于ANALYZE TABLE
更新密钥分发的操作,即使该操作更新表本身(例如,如果它是MyISAM
表),也可能会发生故障。要获取更新的分发统计信息,请设置information_schema_stats_expiry=0
。
该TABLES
表包含以下列:
TABLE_CATALOG
该表所属的目录的名称。此值始终为
def
。TABLE_SCHEMA
表所属的模式(数据库)的名称。
TABLE_NAME
表的名称。
TABLE_TYPE
BASE TABLE
为一个表,VIEW
用于一个视图,或SYSTEM VIEW
为一个INFORMATION_SCHEMA
表。该
TABLES
表未列出TEMPORARY
表。ENGINE
表的存储引擎。请参阅InnoDB存储引擎和备用存储引擎。
对于分区表,
ENGINE
显示所有分区使用的存储引擎的名称。VERSION
该列未使用。删除
.frm
MySQL 8.0中的文件后,此列现在报告的硬编码值10
,这是.frm
MySQL 5.7中使用的最后一个文件版本。ROW_FORMAT
该行的存储格式(
Fixed
,Dynamic
,Compressed
,Redundant
,Compact
)。对于MyISAM
表,Dynamic
对应于myisamchk -dvv报告为的内容Packed
。TABLE_ROWS
行数。一些存储引擎(例如
MyISAM
)存储准确的计数。对于其他存储引擎,例如InnoDB
,该值是一个近似值,可能与实际值相差40%至50%。在这种情况下,请使用SELECT COUNT(*)
以获得准确的计数。TABLE_ROWS
是NULL
对INFORMATION_SCHEMA
表。对于
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群集,
DATA_FREE
显示磁盘上为磁盘数据表或磁盘上的碎片分配但未被磁盘空间使用的空间。(该DATA_LENGTH
列中报告了内存中数据资源的使用情况。)对于分区表,此值仅是估计值,可能不是绝对正确。在这种情况下,获取此信息的一种更准确的方法是查询
INFORMATION_SCHEMA
PARTITIONS
表,如本示例所示:SELECT SUM(DATA_FREE)FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = 'mydb' ANDTABLE_NAME = 'mytable';有关更多信息,请参见“ INFORMATION_SCHEMA分区表”。
AUTO_INCREMENT
下一个
AUTO_INCREMENT
值。CREATE_TIME
创建表的时间。
UPDATE_TIME
数据文件的最后更新时间。对于某些存储引擎,此值为
NULL
。例如,InnoDB
将多个表存储在其系统表空间中,并且数据文件时间戳不适用。即使文件每次表模式与每个InnoDB
在单独的表.ibd
文件,改变缓冲可以延缓写入到数据文件,因此,文件的修改时间是从最后插入,更新或删除的时间不同。对于MyISAM
,使用数据文件时间戳;但是,在Windows上,时间戳不会通过更新进行更新,因此该值不准确。UPDATE_TIME
显示lastUPDATE
,INSERT
或DELETE
对InnoDB
未分区表执行的时间戳记值。对于MVCC,时间戳记值反映了该COMMIT
时间,该时间被视为最后更新时间。重新启动服务器或从InnoDB
数据字典缓存中删除表时,时间戳记不会保留。CHECK_TIME
上次检查表的时间。并非所有存储引擎这次都更新,在这种情况下,该值始终为
NULL
。对于分区
InnoDB
表,CHECK_TIME
始终为NULL
。TABLE_COLLATION
该表的默认排序规则。输出未显式列出表默认字符集,但排序规则名称以字符集名称开头。
CHECKSUM
实时校验和值(如果有)。
CREATE_OPTIONS
与一起使用的额外选项
CREATE TABLE
。CREATE TABLE
执行时指定的原始选项将保留。报告的信息可能与当前表的设置和选项不同。对于
InnoDB
表,将显示实际值ROW_FORMAT
和KEY_BLOCK_SIZE
选项。在MySQL 8.0之前,CREATE_OPTIONS
显示了最初提供的ROW_FORMAT
和KEY_BLOCK_SIZE
。有关更多信息,请参见“ CREATE TABLE语句”。CREATE_OPTIONS
显示partitioned
分区表。在MySQL 8.0.16之前,它还显示了ENCRYPTION
为在每个表文件表空间中创建的表指定的子句。从MySQL 8.0.16开始,如果表已加密或者指定的加密与模式加密不同,则仅显示每表文件表空间的加密子句。对于在常规表空间中创建的表,未显示加密子句。要标识每个表的加密文件和常规表空间,请查询该列。INNODB_TABLESPACES
ENCRYPTION
TABLE_COMMENT
创建表时使用的注释(或有关MySQL为什么无法访问表信息的信息)。
注意
- 对于
NDB
表,此语句的输出显示AVG_ROW_LENGTH
和DATA_LENGTH
列的适当值,但BLOB
不考虑列。 - 对于
NDB
表,仅DATA_LENGTH
包括存储在主存储器中的数据;在MAX_DATA_LENGTH
与DATA_FREE
列应用到磁盘的数据。 - 对于NDB群集磁盘数据表,
MAX_DATA_LENGTH
显示为磁盘数据表或片段的磁盘部分分配的空间。(该DATA_LENGTH
列中报告了内存中数据资源的使用情况。) - 对于
MEMORY
表,DATA_LENGTH
,MAX_DATA_LENGTH
,和INDEX_LENGTH
值近似分配内存的实际数量。分配算法会大量保留内存,以减少分配操作的数量。 - 对于视图,大多数
TABLES
列为0或NULL
除TABLE_NAME
表示视图名称,CREATE_TIME
指示创建时间和TABLE_COMMENT
表示之外的其他列VIEW
。
表信息也可从SHOW TABLE STATUS
and SHOW TABLES
语句获得。请参见“ SHOW TABLE STATUS语句”和“ SHOW TABLES语句”。以下语句是等效的:
SELECT TABLE_NAME ,ENGINE , VERSION,ROW_FORMAT , TABLE_ROWS,AVG_ROW_LENGTH , DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE,AUTO_INCREMENT , CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION,CHECKSUM , CREATE_OPTIONS, TABLE_COMMENTFROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'db_name' [ANDtable_name LIKE 'wild']SHOW TABLE STATUS FROM db_name [LIKE 'wild']
以下语句是等效的:
SELECT TABLE_NAME , TABLE_TYPEFROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'db_name' [ANDtable_name LIKE 'wild']SHOW FULL TABLES FROM db_name [LIKE 'wild']