在关系数据库中,数据库的元数据(例如有关 MySQL 服务器的信息、数据库或表的名、列的数据类型或访问权限)存储在数据字典和/或系统目录中。MySQL 在名为 INFORMATION_SCHEMA 的特殊模式中提供数据库的元数据。每个 MySQL 实例都有一个INFORMATION_SCHEMA 模式。它包含几个只读表,你可以查询这些表以获取你想要的信息。在今天的文章中,我们将使用 Navicat Premium 探讨 INFORMATION_SCHEMA 的一些实际用途。
获取表的信息
information_schema.tables 表包含有关表的元数据。除了表名,你还可以检索其类型(基表或视图)和引擎:
	
	SELECT table_name, table_type, engine
	FROM information_schema.tables
	WHERE table_schema = 'sakila'
	ORDER BY table_name;
	
以下是在 Navicat 运行上述查询的结果:
 
	你还可以查询 information_schema.tables 以获取表的大小:
	
	SELECT
        table_name AS `Table`,
        round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`
	FROM information_schema.TABLES
	WHERE table_schema = "sakila"
	AND table_name = "film";
	
以下是 Navicat Premium 的结果:
 
	你可以稍作调整以列出每个数据库中每个表的大小:
	SELECT
	     table_schema as `Database`,
	     table_name AS `Table`,
	     round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`
	FROM information_schema.TABLES
	ORDER BY (data_length + index_length) DESC;
 
	你甚至可以使用 information_schema.tables 列出 MySQL 实例中每个数据库的大小!
	SELECT
	     table_schema as `Database`,
	     table_name AS `Table`,
	     round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`
	FROM information_schema.TABLES
	ORDER BY (data_length + index_length) DESC;
 
	查看表的统计信息
INFORMATION_SCHEMA.STATISTICS 表包含缓存的值。因此,默认情况下,它们会在 24 小时后过期。如果没有缓存的统计信息或统计信息已过期,则在查询表统计信息列时会从存储引擎中检索统计信息。
INFORMATION_SCHEMA.STATISTICS 表的其中一个用途是查看特定模式中所有表的索引:
	SELECT DISTINCT
	    TABLE_NAME,
	    INDEX_NAME
	FROM INFORMATION_SCHEMA.STATISTICS
	WHERE TABLE_SCHEMA = 'your_schema';
以下是 Navicat 中 sakila 数据库的结果:
 
	只需删除 WHERE 子句,即可查看所有模式中的全部索引。在这种情况下,你可能还想添加数据库名:
	SELECT DISTINCT
	    stat.TABLE_SCHEMA as 'DATABASE',
	    TABLE_NAME,
	    INDEX_NAME
	FROM INFORMATION_SCHEMA.STATISTICS stat;
 
	总结
在本篇文章中,我们了解了使用 MySQL INFORMATION_SCHEMA 获取有关 MySQL 实例中各种对象(数据库、表、列、索引等)的元数据信息。虽然我们是在 Navicat Premium 中运行查询,但使用 Navicat for MySQL 是一样的!两者都有提供 14 天免费试用期,立即亲自尝试一下!
 
							

