在关系数据库中,数据库的元数据(例如有关 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 天免费试用期,立即亲自尝试一下!