### 26.3.38 信息\_模式表表

[](<>)

这[`表格`](information-schema-tables-table.html)table 提供有关数据库中表的信息。

中的列[`表格`](information-schema-tables-table.html)表示表统计信息的值保存缓存值。这[`information_schema_stats_expiry`](server-system-variables.html#sysvar_information_schema_stats_expiry)系统变量定义缓存表统计信息过期之前的时间段。默认值为 86400 秒（24 小时）。如果没有缓存统计信息或统计信息已过期，则在查询表统计信息列时从存储引擎中检索统计信息。要随时更新给定表的缓存值，请使用[`分析表`](analyze-table.html).要始终直接从存储引擎中检索最新的统计信息，请设置[`information_schema_stats_expiry`](server-system-variables.html#sysvar_information_schema_stats_expiry)到`0`.有关详细信息，请参阅[第 8.2.3 节，“优化信息\_SCHEMA 查询”](information-schema-optimization.html).

笔记

如果[`innodb_read_only`](innodb-parameters.html#sysvar_innodb_read_only)系统变量已启用，[`分析表`](analyze-table.html)可能会失败，因为它无法更新数据字典中的统计表，这些表使用`InnoDB`.为了[`分析表`](analyze-table.html)更新密钥分布的操作，即使该操作更新了表本身（例如，如果它是`MyISAM`桌子）。要获取更新的分布统计信息，请设置[`information_schema_stats_expiry=0`](server-system-variables.html#sysvar_information_schema_stats_expiry).

这[`表格`](information-schema-tables-table.html)表有这些列：

-   `表目录`

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

-   `TABLE_SCHEMA`

    表所属的架构（数据库）的名称。

-   `TABLE_NAME`

    表的名称。

-   `TABLE_TYPE`

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

    这[`表格`](information-schema-tables-table.html)表未列出`暂时的`表。

-   `引擎`

    表的存储引擎。看[第 15 章，*InnoDB 存储引擎*](innodb-storage-engine.html)， 和[第 16 章，*替代存储引擎*](storage-engines.html).

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

-   `版本`

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

-   `ROW_FORMAT`

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

-   `TABLE_ROWS`

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

    `TABLE_ROWS`是`空值`为了`INFORMATION_SCHEMA`表。

    为了[`InnoDB`](innodb-storage-engine.html)表中，行数只是 SQL 优化中使用的粗略估计。（如果[`InnoDB`](innodb-storage-engine.html)表已分区。）

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

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

    对于分区表，这个值只是一个估计值，可能不是绝对正确的。在这种情况下获取此信息的更准确方法是查询`INFORMATION_SCHEMA` [`分区`](information-schema-partitions-table.html)表，如本例所示：

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

    有关详细信息，请参阅[第 26.3.21 节，“信息\_SCHEMA 分区表”](information-schema-partitions-table.html).

-   `自动递增`

    下一个`自动递增`价值。

-   `CREATE_TIME`

    创建表的时间。

-   `更新时间`

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

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

-   `CHECK_TIME`

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

    对于分区[`InnoDB`](innodb-storage-engine.html)表，`CHECK_TIME`总是`空值`.

-   `TABLE_COLLATION`

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

-   `校验和`

    实时校验和值（如果有）。

-   `CREATE_OPTIONS`

    使用的额外选项[`创建表`](create-table.html).

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

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

    当创建一个表时[严格模式](glossary.html#glos_strict_mode)禁用，如果不支持指定的行格式，则使用存储引擎的默认行格式。表格的实际行格式报告在`ROW_FORMAT`柱子。`CREATE_OPTIONS`显示在[`创建表`](create-table.html)陈述。

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

-   `TABLE_COMMENT`

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

#### 笔记

-   为了[`新开发银行`](mysql-cluster.html)表，此语句的输出显示适当的值`AVG_ROW_LENGTH`和`DATA_LENGTH`列，除了[`斑点`](blob.html)不考虑列。

-   为了[`新开发银行`](mysql-cluster.html)表，`DATA_LENGTH`仅包括存储在主存储器中的数据；这`MAX_DATA_LENGTH`和`DATA_FREE`列适用于磁盘数据。

-   对于 NDB Cluster 磁盘数据表，`MAX_DATA_LENGTH`显示为磁盘数据表或片段的磁盘部分分配的空间。（内存数据资源使用情况由`DATA_LENGTH`柱子。）

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

-   对于视图，大多数[`表格`](information-schema-tables-table.html)列为 0 或`空值`除了那个`TABLE_NAME`表示视图名称，`CREATE_TIME`表示创建时间，并且`TABLE_COMMENT`说`看法`.

    表格信息也可从[`显示表状态`](show-table-status.html)和[`显示表格`](show-tables.html)陈述。看[第 13.7.7.38 节，“SHOW TABLE STATUS 语句”](show-table-status.html)， 和[第 13.7.7.39 节，“SHOW TABLES 语句”](show-tables.html).以下语句是等效的：


```
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']
```
