# 26.3.38 信息_模式表表

表格table 提供有关数据库中表的信息。

中的列表格表示表统计信息的值保存缓存值。这information_schema_stats_expiry系统变量定义缓存表统计信息过期之前的时间段。默认值为 86400 秒(24 小时)。如果没有缓存统计信息或统计信息已过期,则在查询表统计信息列时从存储引擎中检索统计信息。要随时更新给定表的缓存值,请使用分析表.要始终直接从存储引擎中检索最新的统计信息,请设置information_schema_stats_expiry0.有关详细信息,请参阅第 8.2.3 节,“优化信息_SCHEMA 查询”.

笔记

如果innodb_read_only系统变量已启用,分析表可能会失败,因为它无法更新数据字典中的统计表,这些表使用InnoDB.为了分析表更新密钥分布的操作,即使该操作更新了表本身(例如,如果它是MyISAM桌子)。要获取更新的分布统计信息,请设置information_schema_stats_expiry=0.

表格表有这些列:

  • 表目录

    表所属目录的名称。这个值总是定义.

  • TABLE_SCHEMA

    表所属的架构(数据库)的名称。

  • TABLE_NAME

    表的名称。

  • TABLE_TYPE

    基表对于一张桌子,看法观看,或系统视图INFORMATION_SCHEMA桌子。

    表格表未列出暂时的表。

  • 引擎

    表的存储引擎。看第 15 章,InnoDB 存储引擎, 和第 16 章,替代存储引擎.

    对于分区表,引擎显示所有分区使用的存储引擎的名称。

  • 版本

    此列未使用。随着去除.frmMySQL 8.0 中的文件,此列现在报告硬编码值10, 这是最后一个.frmMySQL 5.7 中使用的文件版本。

  • ROW_FORMAT

    行存储格式(固定的,动态的,压缩,多余的,袖珍的)。为了MyISAM表,动态的对应于什么myisamchk -dvv报告为包装好的.

  • TABLE_ROWS

    行数。一些存储引擎,例如MyISAM,存储确切的计数。对于其他存储引擎,例如InnoDB,这个值是一个近似值,可能与实际值相差 40% 到 50%。在这种情况下,使用选择计数(*)以获得准确的计数。

    TABLE_ROWS空值为了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

    已分配但未使用的字节数。

    InnoDBtables 报告该表所属的表空间的可用空间。对于位于共享表空间中的表,这是共享表空间的空闲空间。如果您使用多个表空间并且该表有自己的表空间,则可用空间仅用于该表。空闲空间是指完全空闲范围中的字节数减去安全裕度。即使可用空间显示为 0,只要不需要分配新的扩展区,就可以插入行。

    对于 NDB 集群,DATA_FREE显示在磁盘上分配给磁盘数据表或磁盘碎片但未被使用的空间。(内存数据资源使用情况由DATA_LENGTH柱子。)

    对于分区表,这个值只是一个估计值,可能不是绝对正确的。在这种情况下获取此信息的更准确方法是查询INFORMATION_SCHEMA 分区表,如本例所示:

    SELECT SUM(DATA_FREE)
        FROM  INFORMATION_SCHEMA.PARTITIONS
        WHERE TABLE_SCHEMA = 'mydb'
        AND   TABLE_NAME   = 'mytable';
    

    有关详细信息,请参阅第 26.3.21 节,“信息_SCHEMA 分区表”.

  • 自动递增

    下一个自动递增价值。

  • CREATE_TIME

    创建表的时间。

  • 更新时间

    上次更新数据文件的时间。对于某些存储引擎,此值为空值.例如,InnoDB在其存储多个表系统表空间并且数据文件时间戳不适用。即使每表文件模式与每个InnoDB单独的表.ibd文件,变化缓冲可以延迟写入数据文件,因此文件修改时间与上次插入、更新或删除的时间不同。为了MyISAM,使用数据文件时间戳;但是,在 Windows 上,时间戳不会被更新更新,因此该值不准确。

    更新时间显示最后一个时间戳值更新,插入, 要么删除执行于InnoDB未分区的表。对于 MVCC,时间戳值反映了犯罪时间,这被认为是最后一次更新时间。重新启动服务器或将表从InnoDB数据字典缓存。

  • CHECK_TIME

    上次检查表的时间。这次不是所有的存储引擎都会更新,这种情况下,值总是空值.

    对于分区InnoDB表,CHECK_TIME总是空值.

  • TABLE_COLLATION

    表默认排序规则。输出没有明确列出表默认字符集,但排序规则名称以字符集名称开头。

  • 校验和

    实时校验和值(如果有)。

  • CREATE_OPTIONS

    使用的额外选项创建表.

    CREATE_OPTIONS节目分区的对于分区表。

    在 MySQL 8.0.16 之前,CREATE_OPTIONS显示加密为在 file-per-table 表空间中创建的表指定的子句。从 MySQL 8.0.16 开始,如果 table 已加密或指定的加密与 schema 加密不同,它会显示 file-per-table 表空间的加密子句。对于在通用表空间中创建的表,未显示加密子句。要识别每个表的加密文件和通用表空间,请查询INNODB_TABLESPACES 加密柱子。

    当创建一个表时严格模式禁用,如果不支持指定的行格式,则使用存储引擎的默认行格式。表格的实际行格式报告在ROW_FORMAT柱子。CREATE_OPTIONS显示在创建表陈述。

    更改表的存储引擎时,不适用于新存储引擎的表选项将保留在表定义中,以便在必要时将具有先前定义的选项的表恢复为原始存储引擎。这CREATE_OPTIONS列可能会显示保留的选项。

  • TABLE_COMMENT

    创建表时使用的注释(或有关 MySQL 为何无法访问表信息的信息)。

# 笔记

  • 为了新开发银行表,此语句的输出显示适当的值AVG_ROW_LENGTHDATA_LENGTH列,除了斑点不考虑列。

  • 为了新开发银行表,DATA_LENGTH仅包括存储在主存储器中的数据;这MAX_DATA_LENGTHDATA_FREE列适用于磁盘数据。

  • 对于 NDB Cluster 磁盘数据表,MAX_DATA_LENGTH显示为磁盘数据表或片段的磁盘部分分配的空间。(内存数据资源使用情况由DATA_LENGTH柱子。)

  • 为了记忆DATA_LENGTH,MAX_DATA_LENGTH, 和INDEX_LENGTH值近似于实际分配的内存量。分配算法会大量保留内存以减少分配操作的次数。

  • 对于视图,大多数表格列为 0 或空值除了那个TABLE_NAME表示视图名称,CREATE_TIME表示创建时间,并且TABLE_COMMENT看法.

    表格信息也可从显示表状态显示表格陈述。看第 13.7.7.38 节,“SHOW TABLE STATUS 语句”, 和第 13.7.7.39 节,“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']