MySQL系统表主要包括以下几类:
1. 信息模式表(Information Schema Tables)
这些表提供了关于数据库元数据的信息,如数据库和表的名称、列的数据类型、访问权限等。
- SCHEMATA: 包含所有数据库的信息。
- TABLES: 包含数据库中表的信息。
- COLUMNS: 包含表中列的信息。
- STATISTICS: 包含关于表索引的信息。
- USER_PRIVILEGES: 包含全局权限信息。
- SCHEMA_PRIVILEGES: 包含数据库权限信息。
- TABLE_PRIVILEGES: 包含表权限信息。
- COLUMN_PRIVILEGES: 包含列权限信息。
- CHARACTER_SETS: 包含可用的字符集信息。
- COLLATIONS: 包含字符集的排序规则信息。
- COLLATION_CHARACTER_SET_APPLICABILITY: 包含排序规则和字符集之间的关联信息。
- TABLE_CONSTRAINTS: 包含表约束的信息。
- KEY_COLUMN_USAGE: 包含表中约束的键列的信息。
- ROUTINES: 包含存储过程和函数的信息。
- VIEWS: 包含视图的信息。
- TRIGGERS: 包含触发器的信息。
2. 性能模式表(Performance Schema Tables)
这些表提供了关于服务器性能的信息,用于监控和调优。
- EVENTS_WAITS_CURRENT: 当前正在等待的事件。
- EVENTS_WAITS_HISTORY: 最近的历史等待事件。
- EVENTS_WAITS_SUMMARY_BY_HOST_BY_EVENT_NAME: 按主机和事件名称汇总的等待事件。
- FILE_STATISTICS: 文件统计信息。
- MACHINE: 机器信息。
- MEMORY_SUMMARY_BY_ACCOUNT_BY_EVENT_NAME: 按账户和事件名称汇总的内存使用情况。
- MEMORY_SUMMARY_BY_HOST_BY_EVENT_NAME: 按主机和事件名称汇总的内存使用情况。
- MEMORY_SUMMARY_BY_THREAD_BY_EVENT_NAME: 按线程和事件名称汇总的内存使用情况。
- MEMORY_SUMMARY GLOBAL_BY_EVENT_NAME: 全局内存使用情况汇总。
- SESSION_ACCOUNT_CONNECTIONS: 会话账户连接信息。
- SESSION_CONNECTIONS: 会话连接信息。
- SESSION_EVENT: 会话事件信息。
- SESSION_STATUS: 会话状态信息。
- SESSION_VARIABLES: 会话变量信息。
- STATISTICS: 统计信息。
- TABLE_io_waits_summary_by_index_usage: 按索引使用情况汇总的表I/O等待信息。
- TABLE_io_waits_summary_by_table: 按表汇总的表I/O等待信息。
- TABLE_lock_waits_summary_by_table: 按表汇总的表锁等待信息。
- THREADS: 线程信息。
- USER_STATISTICS: 用户统计信息。
3. InnoDB系统表
InnoDB存储引擎有自己的系统表,主要用于存储内部数据和元数据。
- INNODB_BUFFER_PAGE: 缓冲池页面信息。
- INNODB_TRX: 当前事务信息。
- INNODB_LOCK_WAITS: 锁等待信息。
- INNODB_LOCKS: 锁信息。
- INNODB_TRX_LOCK_WAITS: 事务锁等待信息。
4. 其他系统表
还有一些其他的系统表,用于特定的功能。
- GLOBAL_STATUS: 全局状态变量。
- GLOBAL_VARIABLES: 全局系统变量。
- PROCESSLIST: 当前连接的进程列表。
- USER: 用户信息。
应用场景
这些系统表主要用于数据库管理和维护,例如:
- 数据库备份和恢复: 通过查询
TABLES
和COLUMNS
表可以获取表的元数据,用于备份和恢复操作。 - 性能监控和调优: 通过查询
PERFORMANCE_SCHEMA
中的表可以获取服务器的性能数据,帮助分析和优化性能。 - 权限管理: 通过查询
USER_PRIVILEGES
、SCHEMA_PRIVILEGES
、TABLE_PRIVILEGES
和COLUMN_PRIVILEGES
表可以管理用户权限。
常见问题及解决方法
问题:查询系统表时出现权限不足
原因: 当前用户没有足够的权限访问系统表。
解决方法: 使用具有足够权限的用户(如root用户)来执行查询,或者授予当前用户相应的权限。
GRANT SELECT ON mysql.* TO 'your_user'@'localhost';
FLUSH PRIVILEGES;
问题:查询系统表时出现性能问题
原因: 系统表可能包含大量数据,查询时可能会导致性能下降。
解决方法: 使用合适的索引和查询条件,避免全表扫描。可以考虑使用EXPLAIN
命令来分析查询计划,优化查询语句。
EXPLAIN SELECT * FROM INFORMATION_SCHEMA.TABLES;
参考链接