MySQL 提供了多种系统预定义的数据库和表单,用于存储元数据、管理权限、记录性能信息等。这些系统表单是 MySQL 数据库管理系统的核心组成部分。
INFORMATION_SCHEMA
INFORMATION_SCHEMA 是 MySQL 和 PostgreSQL 中用于定义数据库元数据的标准数据库。它提供了对数据库结构信息的只读访问。
常用表单
1. SCHEMATA
存储所有数据库(schema)的信息。
1
SELECT*FROM INFORMATION_SCHEMA.SCHEMATA;
主要字段:
CATALOG_NAME: 目录名称
SCHEMA_NAME: 数据库名称
DEFAULT_CHARACTER_SET_NAME: 默认字符集
DEFAULT_COLLATION_NAME: 默认排序规则
2. TABLES
存储所有表的元数据信息。
1 2 3
SELECT TABLE_NAME, TABLE_TYPE, ENGINE, TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA ='your_database';
主要字段:
TABLE_CATALOG: 目录名
TABLE_SCHEMA: 数据库名
TABLE_NAME: 表名
TABLE_TYPE: 表类型(BASE TABLE, VIEW, SYSTEM VIEW)
ENGINE: 存储引擎(InnoDB, MyISAM 等)
VERSION: 表版本
ROW_FORMAT: 行格式
TABLE_ROWS: 表中的行数(估计值)
AVG_ROW_LENGTH: 平均行长度
DATA_LENGTH: 数据文件大小
INDEX_LENGTH: 索引文件大小
AUTO_INCREMENT: 自增值
CREATE_TIME: 创建时间
UPDATE_TIME: 更新时间
TABLE_COLLATION: 表的排序规则
3. COLUMNS
存储所有列的详细信息。
1 2 3 4
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_KEY FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA ='your_database' AND TABLE_NAME ='your_table';
主要字段:
TABLE_SCHEMA: 数据库名
TABLE_NAME: 表名
COLUMN_NAME: 列名
ORDINAL_POSITION: 列的位置
COLUMN_DEFAULT: 默认值
IS_NULLABLE: 是否可为 NULL
DATA_TYPE: 数据类型
CHARACTER_MAXIMUM_LENGTH: 字符最大长度
NUMERIC_PRECISION: 数字精度
NUMERIC_SCALE: 数字小数位数
COLUMN_TYPE: 完整的列类型
COLUMN_KEY: 键类型(PRI, UNI, MUL)
EXTRA: 额外信息(auto_increment 等)
COLUMN_COMMENT: 列注释
4. STATISTICS
存储表索引的统计信息。
1 2 3 4
SELECT INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX, NON_UNIQUE FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA ='your_database' AND TABLE_NAME ='your_table';
主要字段:
TABLE_SCHEMA: 数据库名
TABLE_NAME: 表名
NON_UNIQUE: 是否非唯一索引(0=唯一,1=非唯一)
INDEX_SCHEMA: 索引所在数据库
INDEX_NAME: 索引名称
SEQ_IN_INDEX: 列在索引中的顺序
COLUMN_NAME: 列名
COLLATION: 排序方式(A=升序,D=降序)
CARDINALITY: 基数(唯一值的估计数量)
INDEX_TYPE: 索引类型(BTREE, HASH 等)
5. TABLE_CONSTRAINTS
存储表的约束信息。
1 2 3
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA ='your_database';
约束类型:
PRIMARY KEY: 主键约束
FOREIGN KEY: 外键约束
UNIQUE: 唯一约束
CHECK: 检查约束(MySQL 8.0.16+)
6. KEY_COLUMN_USAGE
存储键列的使用信息。
1 2 3 4
SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA ='your_database' AND TABLE_NAME ='your_table';
7. REFERENTIAL_CONSTRAINTS
存储外键引用约束的信息。
1 2 3
SELECT CONSTRAINT_NAME, UNIQUE_CONSTRAINT_NAME, UPDATE_RULE, DELETE_RULE FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_SCHEMA ='your_database';
8. VIEWS
存储所有视图的定义信息。
1 2 3
SELECT TABLE_NAME, VIEW_DEFINITION, CHECK_OPTION, IS_UPDATABLE FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA ='your_database';
9. TRIGGERS
存储触发器的信息。
1 2 3
SELECT TRIGGER_NAME, EVENT_MANIPULATION, EVENT_OBJECT_TABLE, ACTION_TIMING FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA ='your_database';
主要字段:
TRIGGER_NAME: 触发器名称
EVENT_MANIPULATION: 触发事件(INSERT, UPDATE, DELETE)
EVENT_OBJECT_TABLE: 触发器所在的表
ACTION_TIMING: 触发时机(BEFORE, AFTER)
ACTION_STATEMENT: 触发器执行的 SQL 语句
10. ROUTINES
存储存储过程和函数的信息。
1 2 3
SELECT ROUTINE_NAME, ROUTINE_TYPE, DTD_IDENTIFIER FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA ='your_database';
主要字段:
ROUTINE_NAME: 过程/函数名称
ROUTINE_TYPE: 类型(PROCEDURE, FUNCTION)
DTD_IDENTIFIER: 返回值类型(函数)
ROUTINE_DEFINITION: 过程/函数的定义
11. PARTITIONS
存储分区表的信息。
1 2 3
SELECT TABLE_NAME, PARTITION_NAME, PARTITION_METHOD, PARTITION_EXPRESSION FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA ='your_database';
12. PROCESSLIST
显示当前正在执行的线程信息。
1 2
SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO FROM INFORMATION_SCHEMA.PROCESSLIST;
13. CHARACTER_SETS
列出所有可用的字符集。
1 2
SELECT CHARACTER_SET_NAME, DEFAULT_COLLATE_NAME, DESCRIPTION FROM INFORMATION_SCHEMA.CHARACTER_SETS;
14. COLLATIONS
列出所有可用的排序规则。
1 2
SELECT COLLATION_NAME, CHARACTER_SET_NAME, IS_DEFAULT FROM INFORMATION_SCHEMA.COLLATIONS;
15. ENGINES
列出所有可用的存储引擎。
1 2
SELECT ENGINE, SUPPORT, COMMENT, TRANSACTIONS, XA, SAVEPOINTS FROM INFORMATION_SCHEMA.ENGINES;
支持状态:
YES: 支持并已启用
DEFAULT: 默认引擎
NO: 不支持
DISABLED: 已编译但未启用
mysql 系统数据库
mysql 数据库是 MySQL 服务器的核心系统数据库,存储了用户账户、权限、插件、时区等重要信息。
主要表单
1. user
存储用户账户、权限和认证信息。
1 2
SELECTUser, Host, authentication_string FROM mysql.user;
SELECT t.table_schema, t.table_name FROM information_schema.tables t LEFTJOIN information_schema.table_constraints tc ON t.table_schema = tc.table_schema AND t.table_name = tc.table_name AND tc.constraint_type ='PRIMARY KEY' WHERE t.table_schema NOTIN ('information_schema', 'mysql', 'performance_schema', 'sys') AND t.table_type ='BASE TABLE' AND tc.constraint_name ISNULL;