理论上,INFORMATION_SCHEMA 是 SQL 标准中指定的一组视图,允许用户检查系统的元数据。这是如何在 MySQL 中实现的?
当我连接到全新安装时,我看到两个数据库:mysql
和information_schema
. 在数据库上使用SHOW CREATE TABLE
语句后information_schema
,看起来它不是作为一组视图实现的,而是用基表实现的。这个假设正确吗?或者还有其他对用户隐藏的系统表?
理论上,INFORMATION_SCHEMA 是 SQL 标准中指定的一组视图,允许用户检查系统的元数据。这是如何在 MySQL 中实现的?
当我连接到全新安装时,我看到两个数据库:mysql
和information_schema
. 在数据库上使用SHOW CREATE TABLE
语句后information_schema
,看起来它不是作为一组视图实现的,而是用基表实现的。这个假设正确吗?或者还有其他对用户隐藏的系统表?
INFORMATION_SCHEMA数据库由使用 MEMORY 存储引擎的临时表组成。
示例:这是 MySQL 5.5.12(Windows 版本)中的表 INFORMATION_SCHEMA.TABLES
这些表没有物理文件夹,甚至没有 .frm 文件。你不能 mysqldump 它。你不能放弃它。您不能向其中添加表。您不能从中删除表。那么,桌子在哪里???
INFORMATION_SCHEMA 数据库中的所有表都作为 MEMORY 存储引擎表直接存储在内存中。它们完全在 MySQL 内部,因此 .frm 机制在 mysqld 中处理。在我的回答中,我首先展示了 INFORMATION_SCHEMA.TABLES 的表格布局。它是内存中的临时表。它使用存储引擎协议进行操作。因此,当 mysqld 关闭时,所有 information_schema 表都将被删除。当 mysqld 启动时,所有 information_schema 表都被创建为 TEMPORARY 表,并为 mysql 实例中的每个表重新填充元数据。
INFORMATION_SCHEMA数据库最初是在 MySQL 5.0 中引入的,让您可以访问有关其他存储引擎的表的元数据。例如,您可以执行SHOW DATABASES来获取数据库列表。您也可以像这样查询它们:
您可以通过两种方式检索数据库中的表名:
或者
自成立以来,MySQL 已将 INFORMATION_SCHEMA 数据库扩展为具有进程列表(从 MySQL 5.1 开始)。您实际上可以查询进程列表以查找仍在运行至少 10 分钟的长时间运行的查询:
您可以使用 INFORMATION_SCHEMA 来做每件复杂的事情:例如:
使用特定存储引擎获取所有表的计数:
获取推荐的 MyISAM 密钥缓冲区大小(以 MB 为单位)
以 GB 为单位获取推荐的 InnoDB 缓冲池大小
按存储引擎获取所有数据库的磁盘使用情况(以 MB 为单位)
相信我,INFORMATION_SCHEMA 还有更多奇妙的用途,时间不允许我进一步讨论。
请记住,INFORMATION_SCHEMA 非常敏感,如果 mysql 正在运行并且您执行以下操作:
然后进入mysql运行
您将看到 junkfolder 作为数据库之一。
了解它对于 DBA 和开发人员来说非常重要。MySQL 5.0 Certification Study Guide一书的第 20 章(开发人员)和第 31 章(DBA)
在那里为开发人员和 DBA 认证考试做准备。拿到这本书,好好学习那些章节,你就可以用 MySQL 的 INFORMATION_SCHEMA 做一些很棒的事情。
MySQL 5.5 的 INFORMATION_SCHEMA 数据库现在具有插件、全局变量(状态和静态)、会话变量(状态和静态)、存储引擎状态、性能指标检测、触发器映射、事件(可编程)等等。
抱歉,这可能看起来像 WTMI,但我非常支持使用 INFORMATION_SCHEMA 数据库。