28.3.38 INFORMATION_SCHEMA 表
表TABLES
提供了数据库中的表信息。
在TABLES
中,表示表统计信息的列持有缓存值。系统变量information_schema_stats_expiry
定义了缓存表统计信息过期前的时间间隔。默认为86400秒(24小时)。如果没有缓存统计信息或统计信息已过期,查询表统计信息列时将从存储引擎中检索统计信息。要在任何时候更新给定表的缓存值,请使用ANALYZE TABLE
。要始终从存储引擎中检索最新的统计信息,请将information_schema_stats_expiry
设置为0
。更多信息请见第10.2.3节,“优化 INFORMATION_SCHEMA 查询”。
如果启用了innodb_read_only
系统变量,ANALYZE TABLE
可能会失败,因为它无法更新数据字典中的统计表,这些表使用InnoDB
。即使操作更新了表本身(例如,如果是MyISAM
表),也可能出现失败。要获得更新的分布统计信息,设置information_schema_stats_expiry=0
。
The TABLES
table has these columns:
-
TABLE_ Catalog
该表所属的目录名称。这一值始终为
def
。 -
TABLE_SCHEMA
该表所属的架构(数据库)名称。
-
TABLE_NAME
该表名称。
-
TABLE_TYPE
BASE TABLE
为表,VIEW
为视图,SYSTEM VIEW
为INFORMATION_SCHEMA
表。TABLES
表不包含TEMPORARY
表。 -
ENGINE
表的存储引擎。请参阅第17章, InnoDB 存储引擎,和第18章, Alternative Storage Engines。
对于分区表,
ENGINE
显示所有分区使用的存储引擎名称。 -
VERSION
这个列是未使用的。MySQL 8.0 中删除了
.frm
文件,因此这个列现在报告一个固定的值10
,这是 MySQL 5.7 中最后一个.frm
文件版本。 -
ROW_FORMAT
行存储格式(
Fixed
,Dynamic
,Compressed
,Redundant
,Compact
)。对于MyISAM
表,Dynamic
对应于myisamchk -dvv报告的Packed
。 -
TABLE_ROWS
行数。某些存储引擎,如
MyISAM
,将精确的计数值存储。在其他存储引擎,如InnoDB
,该值是一个近似值,可能与实际值相差40%到50%。在这种情况下,可以使用SELECT COUNT(*)
语句获取准确的计数值。TABLE_ROWS
对INFORMATION_SCHEMA
表格返回NULL
。 -
平均行长。
-
DATA_LENGTH
对于
MyISAM
,DATA_LENGTH
是数据文件的长度,以字节为单位。对于
InnoDB
,DATA_LENGTH
是聚簇索引分配的近似空间大小,以字节为单位。具体来说,它是聚簇索引大小,以页为单位,乘以InnoDB
页大小。请参阅本节末尾的注释,以获取其他存储引擎的信息。
-
对于
MyISAM
,MAX_ DATA_LENGTH
是数据文件的最大长度。这是根据使用的数据指针大小计算的总字节数。请参阅本节末尾的注释,以获取其他存储引擎的信息。
-
INDEX_LENGTH
对于
MyISAM
,INDEX_LENGTH
是索引文件的长度,以字节为单位。对于
InnoDB
,INDEX_LENGTH
是非聚集索引分配的近似空间大小,以字节为单位。具体来说,它是非聚集索引大小(以页面为单位)乘以InnoDB
页面大小。请参阅本节末尾的注释,以获取其他存储引擎的信息。
-
DATA__FREE
已分配但未使用的字节数。
InnoDB
表报告所属表空间的空闲空间。如果您使用多个表空间且该表有其自己的表空间,则空闲空间仅适用于该表。空闲空间表示完全免费的extent数量减去安全缓冲区,即使显示为0,也可能可以插入行,只要不需要分配新的extent。对于NDB集群,
DATA__FREE
显示磁盘上用于但未使用的Disk Data表或碎片的空间大小。(内存数据资源使用情况由DATA_LENGTH
列报告。)对于分区表,这个值仅供估计,可能不准确。在这种情况下,可以使用
INFORMATION_SCHEMA
中的PARTITIONS
表来获取更准确的信息,如下所示:SELECT SUM(DATA_FREE) FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = 'mydb' AND TABLE_NAME = 'mytable';
更多信息,请见第28.3.21节,“The INFORMATION_ SCHEMA PARTITIONS Table”。
-
AUTO_INCREMENT
下一个
AUTO_INCREMENT
值。 -
CREATE_TIME
表创建时间。
-
UPDATE_TIME
表最后更新时间。对于一些存储引擎,这个值为
NULL
。即使在文件-每张表模式下,每个InnoDB
表都在单独的.ibd
文件中,但是更改缓冲可以延迟写入到数据文件,因此文件修改时间不同于最后一次插入、更新或删除的时间。对于MyISAM
,使用数据文件时间戳;然而,在 Windows 上,时间戳不由更新操作更新,所以值不准确。UPDATE_时间
显示了最后一次对InnoDB
表进行UPDATE
、INSERT
或DELETE
的时间戳值。对于MVCC,时间戳值反映了COMMIT
时间,这被认为是最后一次更新时间。时间戳不在服务器重启或表从InnoDB
数据字典缓存中 evicted 时被持久化。 -
CHECK_时间
最后一次检查该表的时间。不是所有存储引擎都更新这个时间,如果是,则值总是
NULL
。对于分区的
InnoDB
表,CHECK_时间
总是NULL
。 -
TABLE_COLLATION
表默认排序规则。输出不明确列出表默认字符集,但排序规则名称以字符集名称开头。
-
CHECKSUM
当前的live checksum 值,如果有。
-
CREATE_OPTIONS
与
CREATE TABLE
一起使用的额外选项。CREATE_OPTIONS
显示分区表的partitioned
。CREATE_OPTIONS
显示在文件-per-表空间中创建的表的ENCRYPTION
子句。如果表是加密的或指定的加密与架构加密不同,显示加密子句。对于在公共表空间中创建的表,不显示加密子句。要确定文件-per-表空间和公共表空间是否加密,可以查询INNODB_TABLESPACES
中的ENCRYPTION
列。在禁用严格模式的情况下,创建表时如果指定的行格式不受支持,存储引擎将使用其默认行格式。如果指定的行格式不受支持,实际表的行格式将在
ROW_FORMAT
列中报告。CREATE_OPTIONS
显示在CREATE TABLE
语句中指定的行格式。当更改表的存储引擎时,新的存储引擎不适用的表选项将保留在表定义中,以便如果必要,可以将表 revert 到原来的存储引擎和之前定义的选项。
CREATE_OPTIONS
列可能显示保留的选项。 -
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
和SHOW TABLES
语句中获取。请参阅第15.7.7.37节,“SHOW TABLE STATUS 语句”和第15.7.7.38节,“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_COMMENT
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = 'db_name'
[AND table_name LIKE 'wild']
SHOW TABLE STATUS
FROM db_name
[LIKE 'wild']
以下语句等效:
SELECT
TABLE_NAME, TABLE_TYPE
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = 'db_name'
[AND table_name LIKE 'wild']
SHOW FULL TABLES
FROM db_name
[LIKE 'wild']