MySQL OCP888题解072-显示表的存储引擎的方法
文章目录
- 1、原题
- 1.1、英文原题
- 1.2、答案
- 2、题目解析
- 2.1、题干解析
- 2.2、选项解析
- 3、知识点
- 3.1、知识点1:SHOW TABLE STATUS语句
- 3.2、知识点2:INFORMATION_SCHEMA TABLES表
- 3.3、知识点3:INFORMATION_SCHEMA ENGINES表
- 4、总结
1、原题
1.1、英文原题
1.2、答案
A、C、D
2、题目解析
2.1、题干解析
本题考察如何显示表的存储引擎。
2.2、选项解析
- SHOW CREATE TABLE查看表的定义,是可以看到存储引擎的,所以选项A正确。
- SHOW TABLE STATUS能够显示表的存储引擎,所以选项C正确。
- INFORMATION_SCHEMA的TABLES表能够显示表的存储引擎,所以选项D正确。
- ENGINES表提供了关于存储引擎的信息。这对于检查一个存储引擎是否被支持,或者查看默认的引擎是什么,特别有用。ENGINES表显示的是这个数据库支持哪些引擎,而不是具体哪个表用的什么引擎。
3、知识点
3.1、知识点1:SHOW TABLE STATUS语句
- SHOW TABLE STATUS的工作方式与SHOW TABLES类似,但提供了关于每个非TEMPORARY表的大量信息。
- 语法
SHOW TABLE STATUS
[{FROM | IN} db_name]
[LIKE 'pattern' | WHERE expr]
-
SHOW TABLE STATUS输出有这些列:
- name:该表的名称。
- engine:该表的存储引擎。对于分区表,Engine显示所有分区使用的存储引擎的名称。
- version:该表的.frm文件的版本号。
- Row_format:行存储格式(固定的,动态的,压缩的,冗余的,紧凑的)。对于MyISAM表,动态对应于myisamchk -dvv报告的Packed。当使用Antelope文件格式时,InnoDB表的格式是Redundant或Compact,当使用Barracuda文件格式时,是Compressed或Dynamic。
- Rows:行的数量。一些存储引擎,如MyISAM,存储精确的计数。对于其他的存储引擎,比如InnoDB,这个值是一个近似值,可能与实际值有40%到50%的差异。在这种情况下,使用SELECT COUNT(
*
)来获得一个准确的计数。对于INFORMATION_SCHEMA表,Rows值是NULL。 - 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:已分配但未使用的字节数。对于位于共享表空间的表,这是共享表空间的可用空间。
- Auto_increment:下一个AUTO_INCREMENT值。
- Create_time:表被创建的时间。
- Update_time:数据文件最后一次被更新的时间。对于某些存储引擎,这个值是NULL。例如,InnoDB在其系统表空间中存储多个表,数据文件的时间戳并不适用。即使在每个InnoDB表都在一个单独的.ibd文件的逐表模式下,变化缓冲也会延迟对数据文件的写入,所以文件修改时间与最后一次插入、更新或删除的时间不同。对于MyISAM,使用的是数据文件的时间戳;然而,在Windows上,时间戳不会因为更新而更新,所以这个值是不准确的。Update_time显示在没有分区的InnoDB表上执行的最后一次UPDATE、INSERT或DELETE的时间戳值。对于MVCC,时间戳值反映了COMMIT时间,它被认为是最后的更新时间。当服务器被重新启动或表被从InnoDB数据字典缓存中驱逐时,时间戳不会被持久化。
- Check_time:该表最后一次被检查的时间。不是所有的存储引擎都会更新这个时间,在这种情况下,该值总是为空。
- Collation:表的默认拼写方式。输出中没有明确列出表的缺省字符集,但是校对名称以字符集名称开始。
- Checksum:实时校验值,如果有的话。
- Comment:创建表时使用的注释(或关于MySQL无法访问表信息的信息)。
- Create_options:用于CREATE TABLE的额外选项。Create_options显示分区表的分区情况。Create_options显示了在创建或改变一个逐个文件的表空间时指定的ENCRYPTION选项。当创建一个禁用严格模式的表时,如果指定的行格式不被支持,就会使用存储引擎的默认行格式。表的实际行格式会在Row_format列中报告。Create_options显示在CREATE TABLE语句中指定的行格式。当改变一个表的存储引擎时,不适用新的存储引擎的表选项会保留在表的定义中,以便在必要时能够将具有以前定义的选项的表恢复到原来的存储引擎。Create_options可以显示保留的选项。
-
对于InnoDB表,SHOW TABLE STATUS并不能给出准确的统计数据,除了表所保留的物理大小。行数只是一个用于SQL优化的粗略估计。
-
对于MEMORY表,Data_length,Max_data_length和Index_length的值接近于实际分配的内存量。分配算法保留大量的内存以减少分配操作的数量。
-
对于视图,SHOW TABLE STATUS显示的所有列都是空的,除了Name表示视图名称和Comment表示VIEW。
-
表的信息也可以从INFORMATION_SCHEMA TABLES表中获得。
官方参考文档
3.2、知识点2:INFORMATION_SCHEMA TABLES表
INFORMATION_SCHEMA的TABLES表提供了如下关于数据库中的表的信息:
- TABLE_CATALOG:该表所属目录的名称。这个值总是def。
- TABLE_SCHEMA:表所属的模式(数据库)的名称。
- TABLE_NAME:该表的名称。
- TABLE_TYPE:BASE TABLE代表表,VIEW代表视图,或者SYSTEM VIEW代表INFORMATION_SCHEMA表。TABLES表并没有列出TEMPORARY表。
- ENGINE:该表的存储引擎。对于分区表,ENGINE显示的是所有分区使用的存储引擎的名称。所以选项D是正确的。
- VERSION:该表的.frm文件的版本号。
- ROW_FORMAT:行存储格式(固定的,动态的,压缩的,冗余的,紧凑的)。对于MyISAM表,动态对应于myisamchk -dvv报告的Packed。当使用Antelope文件格式时,InnoDB表的格式是Redundant或Compact,当使用Barracuda文件格式时,是Compressed或Dynamic。
- TABLE_ROWS:行的数量。一些存储引擎,比如MyISAM,存储精确的计数。对于其他的存储引擎,比如InnoDB,这个值是一个近似值,可能与实际值有40%到50%的差异。在这种情况下,使用SELECT COUNT(
*
)来获得一个准确的计数。对于INFORMATION_SCHEMA表,TABLE_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,只要不需要分配新的扩展,就有可能插入行。
- AUTO_INCREMENT:下一个AUTO_INCREMENT值。
- CREATE_TIME:该表的创建时间。
- UPDATE_TIME:数据文件最后被更新的时间。对于一些存储引擎,这个值是NULL。例如,InnoDB在其系统表空间中存储多个表,数据文件的时间戳并不适用。即使在每个InnoDB表都在一个单独的.ibd文件的逐表模式下,变化缓冲也会延迟对数据文件的写入,所以文件修改时间与最后一次插入、更新或删除的时间不同。对于MyISAM,使用的是数据文件的时间戳;但是,在Windows上,时间戳不会因为更新而更新,所以这个值是不准确的。
- CHECK_TIME:该表最后一次被检查的时间。不是所有的存储引擎都会更新这个时间,在这种情况下,这个值总是为空。对于分区的InnoDB表,CHECK_TIME总是NULL。
- table_collation:表的默认整理方式。输出中没有明确列出表的默认字符集,但整理名称以字符集名称开头。
- CHECKSUM:实时校验值,如果有的话。
- TABLE_COMMENT:创建表时使用的注释(或关于为什么MySQL不能访问表信息的信息)。
- CREATE_OPTIONS:用于CREATE TABLE的额外选项。如果表是分区的,CREATE_OPTIONS显示为分区。CREATE_OPTIONS显示了为在每个文件表空间中创建的表指定的ENCRYPTION子句。当创建一个禁用严格模式的表时,如果指定的行格式不被支持,则使用存储引擎的默认行格式。表的实际行格式会在ROW_FORMAT列中报告。CREATE_OPTIONS显示在CREATE TABLE语句中指定的行格式。当改变表的存储引擎时,不适用于新的存储引擎的表选项会保留在表的定义中,以便在必要时能够将具有以前定义的选项的表恢复到原来的存储引擎。CREATE_OPTIONS列可以显示保留的选项。
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=‘sakila’ AND TABLE_NAME LIKE ‘payment’;和SHOW TABLE STATUS IN sakila LIKE ‘payment’;结果基本相同。
官方参考文档
3.3、知识点3:INFORMATION_SCHEMA ENGINES表
ENGINES表提供了关于存储引擎的信息。这对于检查一个存储引擎是否被支持,或者查看默认的引擎是什么,特别有用。ENGINES表显示的是这个数据库支持哪些引擎,而不是具体哪个表用的什么引擎。
ENGINES表有如下列:
- ENGINE:存储引擎的名称。
- SUPPORT:服务器对存储引擎的支持程度,如下所示。
- YES:该引擎被支持并且处于激活状态
- DEFAULT:和YES一样,另外这是默认的引擎。
- NO:该引擎不被支持。值为NO意味着服务器在编译时不支持该引擎,所以在运行时不能启用。
- DISABLED:该引擎被支持,但已被禁用。值为DISABLED是因为服务器在启动时有一个禁用引擎的选项,或者是因为没有给出启用引擎所需的所有选项。在后一种情况下,错误日志应该包含一个原因,说明为什么该选项被禁用。如果服务器被编译为支持某个存储引擎,但是在启动时使用了–skip-engine_name选项,那么你也可能看到DISABLED。所有MySQL服务器都支持MyISAM表。不可能禁用MyISAM。
- COMMENT:对存储引擎的简要描述。
- TRANSACTIONS:存储引擎是否支持交易。
- XA:存储引擎是否支持分布式事务交易。
- SAVEPOINTS:存储引擎是否支持保存点。
存储引擎的信息也可以通过SHOW ENGINES语句获得,内容和SELECT * FROM INFORMATION_SCHEMA.ENGINES是一样的。
官方参考文档
4、总结
- 查看一个表使用的存储引擎,可以使用SHOW CREATE TABLE tbl_name、SHOW TABLE STATUS LIKE ‘tbl_name’、SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_name=‘tbl_name’,其中SHOW TABLE STATUS和INFORMATION_SCHEMA.TABLES的结果基本相同。
- ENGINES表显示的是数据库支持哪些引擎,而不是具体哪个表用的什么引擎。