文章目录
在数据库管理领域,元数据犹如数据库的 “说明书”,为我们了解和管理数据提供关键指引。对于 MySQL 数据库而言,元数据涵盖了数据库、表、列、索引、用户权限等重要信息。本文将深入探讨 MySQL 元数据的存放位置、相关操作,介绍实用的 SHOW 命令,剖析 information_schema
库的使用,补充 MySQL 自带系统数据库的知识,以及讲解 MySQL 数据在文件系统中的表示形式。
1. 元数据(schema)了解
元数据是指用于描述数据的数据,它提供了关于数据的背景信息、定义、结构、上下文以及其他相关特征,帮助人们更好地理解、管理、使用和维护数据。
MySQL 元数据就是描述 MySQL 数据库中数据对象及相关信息的数据。它用于描述数据库对象的属性、关系和其他特征,如数据库、表、列、索引、用户权限等信息。
- 元数据的存放位置
元数据的物理存放位置是在之前设定的存放实例数据的位置。可以在数据库中通过查看datadir
参数变量获取。
mysql> SHOW VARIABLES LIKE 'datadir';
+---------------+------------------+
| Variable_name | Value |
+---------------+------------------+
| datadir | /data/3306/data/ |
+---------------+------------------+
1 row in set (0.01 sec)
- 存储元数据的系统数据库
MySQL 中管理元数据的数据库主要是 information_schema
和 mysql
数据库。
information_schema
是一个虚拟数据库,包含了一系列只读视图,这些视图提供了关于数据库服务器中所有数据库、表、列、索引、用户权限等元数据的信息。mysql
是 MySQL 系统自带的数据库,它存储了 MySQL 服务器的配置信息、用户账户信息、数据库和表的权限信息等重要的元数据。
- 与元数据相关的操作
- 查询元数据:使用SQL语句从
information_schema
等系统数据库的相关表中查询元数据。例如,查询information_schema.COLUMNS
表来获取指定表的列信息。- 修改元数据:通过
ALTER TABLE
等语句修改表结构,从而改变元数据。例如,使用ALTER TABLE ADD COLUMN
语句添加新列,会更新information_schema.COLUMNS
表中的相关元数据信息。- 删除元数据:当删除数据库对象(如表、索引等)时,相应的元数据也会被删除。例如,使用
DROP TABLE
语句删除表,不仅会删除表中的数据,还会删除information_schema.TABLES
和COLUMNS
等表中对应的元数据记录。
2. SHOW 命令介绍
在 MySQL 里,SHOW 命令用途广泛,能够查看数据库、表、索引、用户等各类元数据信息。
- 数据库相关操作
-- 查看所有数据库
SHOW DATABASES;
-- 查看创建数据库的语句
SHOW CREATE DATABASE your_database_name;
-- 查看数据库中表的状态信息
USE your_database_name;
SHOW TABLE STATUS;
- 数据表相关操作
-- 查看指定数据库中的所有表
USE your_database_name;
SHOW TABLES;
-- 查看创建表的语句
SHOW CREATE TABLE your_table_name;
-- 查看表的详细信息
SHOW TABLE STATUS LIKE 'your_table_name';
-- 查看表的列信息
SHOW COLUMNS FROM your_table_name;
-- 查看表的索引信息
SHOW INDEX FROM your_table_name;
- 字符、规则、权限相关操作
-- 查看所有可用字符集
SHOW CHARACTER SET;
-- 查看指定字符集的详细信息
SHOW CHARACTER SET LIKE 'your_character_set';
-- 查看所有可用比较规则
SHOW COLLATION;
-- 查看指定字符集的所有比较规则
SHOW COLLATION WHERE Charset = 'your_character_set';
-- 查看权限列表
SHOW PRIVILEGES;
-- 查看当前用户的权限
SHOW GRANTS;
-- 查看指定用户的权限
SHOW GRANTS FOR 'your_user'@'your_host';
- 查看执行线程语句
-- 查看简要的线程信息
SHOW PROCESSLIST;
-- 查看包含完整 SQL 语句的线程信息
SHOW FULL PROCESSLIST;
- 查看相关参数
-- 查看所有全局变量
SHOW VARIABLES;
-- 查看特定全局变量
SHOW VARIABLES LIKE '%character_set%';
-- 查看所有状态变量
SHOW STATUS;
-- 查看特定状态变量
SHOW STATUS LIKE '%connection%';
-- 查看会话变量
SHOW SESSION VARIABLES;
-- 查看会话状态
SHOW SESSION STATUS;
其他更多的show命令使用方法,可以通过查看show命令的帮助文档进行了解。
3. 查看 information_schema 库
information_schema
是 MySQL 中的一个系统数据库,它提供了关于数据库元数据的信息,包括数据库、表、列、索引、用户权限等。管理员可以通过查询元数据库表信息,了解数据库运行状态。
3.1 主要数据表及用途
SCHEMATA
表:记录了 MySQL 实例中所有数据库(也称为模式)的信息,包含数据库名称、默认字符集、默认排序规则等。通过查询该表,能获取服务器上所有数据库的基本信息。
SELECT * FROM information_schema.SCHEMATA;
数据字段代表信息
CATALOG_NAME
:数据库目录名,在 MySQL 里通常固定为def
。SCHEMA_NAME
:数据库的名称。DEFAULT_CHARACTER_SET_NAME
:该数据库的默认字符集。DEFAULT_COLLATION_NAME
:该数据库默认字符集对应的排序规则。SQL_PATH
:此列一般为 NULL,在 MySQL 中暂未使用。DEFAULT_ENCRYPTION
:指示数据库默认的加密状态。
TABLES
表:存储了每个数据库中所有表的详细信息,如数据库名、表名、表类型(如基表、视图)、存储引擎、创建时间、更新时间等。这有助于了解数据库中各个表的基本属性和状态。
SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_database_name';
# 查看数据表结构
DESC information_schema.TABLES;
数据字段代表信息
TABLE_CATALOG
:表所属的目录名,在 MySQL 中通常固定为def
。TABLE_SCHEMA
:表所属的数据库名。TABLE_NAME
:表的名称。TABLE_TYPE
:表的类型,常见的值有 BASE TABLE(基表,即实际存储数据的表)、VIEW(视图)。ENGINE
:表使用的存储引擎,如 InnoDB、MyISAM 等。VERSION
:存储引擎的版本号(不同存储引擎含义有所不同,对于一些引擎,该值可能意义不大)。ROW_FORMAT
:表的行格式,例如 Compact、Redundant 等,它决定了数据在磁盘上的存储方式。TABLE_ROWS
:表中的大致行数(这个值并不总是准确的,尤其是对于一些复杂的存储引擎或频繁更新的表)。AVG_ROW_LENGTH
:表中平均行长度(以字节为单位)。DATA_LENGTH
:表中数据的总长度(以字节为单位)。MAX_DATA_LENGTH
:表能够存储的最大数据长度(以字节为单位,对于某些存储引擎,该值可能是理论上的最大值)。INDEX_LENGTH
:表中索引的总长度(以字节为单位)。DATA_FREE
:表中已分配但未使用的空间(以字节为单位)。AUTO_INCREMENT
:如果表有自增列,该列显示下一个将被分配的自增值;如果没有自增列,则为 NULL。CREATE_TIME
:表的创建时间。UPDATE_TIME
:表的最后更新时间(如果没有更新过,可能为 NULL)。CHECK_TIME
:表的最后检查时间(如果没有进行过检查,可能为 NULL)。TABLE_COLLATION
:表的字符集排序规则。CHECKSUM
:表的校验和值(如果启用了校验和功能),用于检测数据损坏;如果未启用,则为 NULL。CREATE_OPTIONS
:创建表时指定的其他选项(以字符串形式存储)。TABLE_COMMENT
:表的注释信息。
COLUMNS
表:提供了每个表中列的详细信息,包括列名、数据类型、是否允许为空、默认值、字符集、排序规则等。在开发和维护过程中,可借助该表快速了解表的结构。
SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_NAME = 'your_table_name';
数据字段代表信息
TABLE_CATALOG
:表所属的目录名,在 MySQL 里通常是 def。TABLE_SCHEMA
:表所属的数据库名。TABLE_NAME
:表的名称。COLUMN_NAME
:列的名称。ORDINAL_POSITION
:列在表中的位置,从 1 开始计数。COLUMN_DEFAULT
:列的默认值。如果没有默认值,可能为 NULL。IS_NULLABLE
:指示该列是否允许为 NULL,值为 YES 或 NO。DATA_TYPE
:列的数据类型,例如 int、varchar、date 等。CHARACTER_MAXIMUM_LENGTH
:对于字符类型的列,该列表示字符的最大长度;对于非字符类型的列,值为 NULL。CHARACTER_OCTET_LENGTH
:对于字符类型的列,该列表示字节的最大长度;对于非字符类型的列,值为 NULL。NUMERIC_PRECISION
:对于数值类型的列,该列表示数值的精度(即总位数);对于非数值类型的列,值为 NULL。NUMERIC_SCALE
:对于数值类型的列,该列表示数值的小数位数;对于非数值类型的列,值为 NULL。DATETIME_PRECISION
:对于日期和时间类型的列,该列表示精度;对于其他类型的列,值为 NULL。CHARACTER_SET_NAME
:对于字符类型的列,该列表示字符集名称;对于非字符类型的列,值为 NULL。COLLATION_NAME
:对于字符类型的列,该列表示排序规则;对于非字符类型的列,值为 NULL。COLUMN_TYPE
:列的完整类型定义,包含长度、精度等详细信息。COLUMN_KEY
:指示该列是否是索引的一部分,常见的值有 PRI(主键)、UNI(唯一索引)、MUL(普通索引),若不是索引列则为空。EXTRA
:列的额外信息,例如 auto_increment 表示该列是自增列。PRIVILEGES
:用户对该列的权限,以逗号分隔的字符串形式表示,如 select,insert,update。COLUMN_COMMENT
:列的注释信息。GENERATION_EXPRESSION
:如果列是生成列,该列显示生成列的表达式;若不是生成列,则为空。
STATISTICS
表:包含了表的索引信息,如索引名、索引类型、索引包含的列、是否唯一索引等。
SELECT * FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_NAME = 'your_table_name';
USER_PRIVILEGES
表:记录了用户的全局权限信息。SCHEMA_PRIVILEGES
表:存储了用户在数据库层面的权限信息。TABLE_PRIVILEGES
表:保存了用户在表层面的权限信息。COLUMN_PRIVILEGES
表:提供了用户在列层面的权限信息。
SELECT * FROM information_schema.USER_PRIVILEGES WHERE GRANTEE = 'your_user'@'your_host';
3.2 应用举例
- 查询数据表归属数据库
mysql> use information_schema;
Database changed
mysql> SELECT TABLE_SCHEMA FROM information_schema.TABLES WHERE TABLE_NAME = "user";
+--------------+
| TABLE_SCHEMA |
+--------------+
| mysql |
+--------------+
1 row in set (0.00 sec)
- 查user表有多少行记录
mysql> use information_schema;
Database changed
mysql> select TABLE_NAME,table_rows from information_schema.TABLES where TABLE_NAME = "user";
+------------+------------+
| TABLE_NAME | TABLE_ROWS |
+------------+------------+
| user | 10 |
+------------+------------+
1 row in set (0.00 sec)
mysql> select count(*) from mysql.user;
+----------+
| count(*) |
+----------+
| 10 |
+----------+
1 row in set (0.07 sec)
两种查询方式相比较,通过元数据查询效率高,后面实时查询效率很低。
- 统计所有库对应的表个数和名字列表
SELECT
table_schema AS 数据库名称,
COUNT(table_name) AS 表个数,
GROUP_CONCAT(table_name SEPARATOR ', ') AS 表名字列表
FROM
information_schema.tables
GROUP BY table_schema;
- 查询非系统表的每个库的表数量和表名称
SELECT
table_schema AS 数据库名称,
COUNT(table_name) AS 表个数,
GROUP_CONCAT(table_name SEPARATOR ', ') AS 表名字列表
FROM
information_schema.tables
WHERE
table_schema NOT IN ('information_schema','mysql','performance_schema','sys')
GROUP BY table_schema;
- 统计每个库的数据量大小
# 语句一
SELECT
table_schema AS '数据库名称',
SUM(data_length + index_length) / 1024 AS '数据量大小(MB)'
FROM
information_schema.TABLES
GROUP BY
table_schema;
# 语句二
SELECT
table_schema AS '数据库名称',
SUM(TABLE_ROWS * AVG_ROW_LENGTH + index_length) / 1024 AS '数据量大小(MB)'
FROM
information_schema.TABLES
GROUP BY
table_schema;
这两条 SQL 语句的主要目的都是统计 MySQL 中各个数据库的数据量大小,但它们的数据准确性和适用场景存在明显区别。
- 数据准确性
- 语句一:数据相对准确,因为它基于存储引擎记录的实际磁盘占用空间。不过,
data_length
和index_length
不会实时更新,在大量数据操作后,统计信息可能滞后于实际磁盘空间变化。- 语句二:数据准确性较差,因为
TABLE_ROWS
是估计值,与实际行数可能存在较大偏差;AVG_ROW_LENGTH
是平均值,实际每行长度会有波动,这些因素都会导致估算结果不准确。- 适用场景
- 语句一:适用于需要精确了解数据库实际磁盘占用空间的场景,如磁盘容量规划、数据备份策略制定等。
- 语句二:适用于无法获取准确
data_length
信息,只需要对数据库数据量进行大致估算的场景。
4. 补充:默认数据库
MySQL自带的系统数据库有4个。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
以下是以表格形式呈现的MySQL自带系统数据库的相关信息:
数据库名称 | 简介 | 主要作用 |
---|---|---|
information_schema | 虚拟数据库,通过查询底层系统表和数据字典动态生成结果 | 提供数据库中所有数据库、表、列、索引、用户权限等元数据信息,帮助了解数据库结构和对象定义 |
performance_schema | 用于收集和分析MySQL服务器性能数据 | 深入了解服务器内部运行情况,如线程活动、查询执行时间、锁等待、资源使用等,为性能优化提供依据 |
mysql | 核心系统数据库,存储服务器运行必需的元数据 | 包含用户账户信息、数据库权限、存储过程、事件、字符集定义、时区信息等,是数据库安全管理等的重要依据 |
sys | MySQL 5.7版本引入,提供视图帮助查询和分析性能数据 | 基于performance_schema和information_schema整理数据,提供更易理解和使用的接口,方便了解数据库使用情况等 |
5. 补充:在文件系统中的表示
在文件系统中,MySQL 数据的表示形式因存储引擎和配置的不同而有所差异,这里主要介绍常见的 InnoDB 和 MyISAM 存储引擎下数据在文件系统中的表示。
5.1 数据库在文件系统的表示
在使用 CREATE DATABASE 数据库名
语句创建数据库时,MySQL会在文件系统层面进行如下操作:
- 在数据目录(如上
/data/3306/data/
)下,创建一个与数据库同名的子目录,用于存储该数据库相关的数据和文件。
[root@db80 data]# ll
total 95744
-rw-r----- 1 mysql mysql 56 Nov 6 09:52 auto.cnf
-rw-r----- 1 mysql mysql 28791 Apr 25 14:41 binlog.000006
-rw-r----- 1 mysql mysql 1580 Apr 25 14:53 binlog.000007
......
drwxr-x--- 2 mysql mysql 4096 Apr 25 14:41 #innodb_redo
drwxr-x--- 2 mysql mysql 187 Apr 25 14:41 #innodb_temp
drwxr-x--- 2 mysql mysql 143 Nov 6 09:52 mysql #####
-rw-r----- 1 mysql mysql 30408704 Apr 26 16:06 mysql.ibd
drwxr-x--- 2 mysql mysql 8192 Nov 6 09:52 performance_schema #####
-rw------- 1 mysql mysql 1705 Nov 6 09:52 private_key.pem
-rw-r--r-- 1 mysql mysql 452 Nov 6 09:52 public_key.pem
-rw-r--r-- 1 mysql mysql 1112 Nov 6 09:52 server-cert.pem
-rw------- 1 mysql mysql 1705 Nov 6 09:52 server-key.pem
drwxr-x--- 2 mysql mysql 28 Nov 6 09:52 sys #####
-rw-r----- 1 mysql mysql 16777216 Apr 25 14:52 undo_001
-rw-r----- 1 mysql mysql 16777216 Apr 26 16:08 undo_002
- 在MySQL 5.7及之前版本中,会在上述新建的同名子目录下,生成一个名为
db.opt
的文件。该文件记录了数据库的关键属性信息,包括字符集设置和比较规则等重要配置。
[root@db57 mysql]# ll
total 11976
-rw-r----- 1 mysql mysql 8820 May 1 08:45 columns_priv.frm
-rw-r----- 1 mysql mysql 0 May 1 08:45 columns_priv.MYD
-rw-r----- 1 mysql mysql 4096 May 1 08:45 columns_priv.MYI
-rw-r----- 1 mysql mysql 9582 May 1 08:45 db.frm
-rw-r----- 1 mysql mysql 976 May 1 08:45 db.MYD
-rw-r----- 1 mysql mysql 5120 May 1 08:45 db.MYI
-rw-r----- 1 mysql mysql 65 May 1 08:45 db.opt #####
-rw-r----- 1 mysql mysql 8780 May 1 08:45 engine_cost.frm
-rw-r----- 1 mysql mysql 98304 May 1 08:45 engine_cost.ibd
......
在数据目录下,除 information_schema
等系统数据库外,用户创建的其他数据库都会对应生成一个同名子目录,用于独立存放数据库相关数据文件,确保各数据库数据的隔离与管理。
5.2 数据表在文件系统的表示
在数据管理领域,数据通常以记录为单位插入到数据库表中。每张表的信息可清晰地划分为两类:
-
表结构的定义。表结构是对表的整体框架的精准描述,包含表的名称,表内列的数量及其各自的数据类型,约束条件,索引,还有使用的字符集和比较规则。所有这些关于表结构的信息,都会在建表语句中完整呈现。
-
表中的数据。这些数据是一条条具体的记录,是实际业务信息的体现,按照既定的表结构有序地插入到表中。
InnoDB存储引擎模式
为了保存表结构,InnoDB在数据目录下对应的数据库子目录下创建了一个专门用于描述表结构的文件(只有MySQL 5.7 及之前的版本有),文件名是这样的:
表名.frm
比方说我们在test数据库下创建一个名为users的表:
mysql> use test;
Database changed
mysql> CREATE TABLE IF NOT EXISTS users (
-> user_id INT AUTO_INCREMENT PRIMARY KEY,
-> username VARCHAR(50) NOT NULL UNIQUE,
-> email VARCHAR(100) NOT NULL UNIQUE,
-> registration_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-> );
Query OK, 0 rows affected (0.04 sec)
那在数据库test对应的子目录下就会创建一个名为 users.frm
的用于描述表结构的文件。.frm
文件的格式在不同的平台上都是相同的。这个后缀名为.frm
是以二进制格式存储的,我们直接打开是乱码的。
[root@db57 test]# ll
total 144
-rw-r----- 1 mysql mysql 65 May 2 09:38 db.opt
-rw-r----- 1 mysql mysql 8692 May 2 09:39 users.frm
-rw-r----- 1 mysql mysql 131072 May 2 09:39 users.ibd
- 表中数据和索引简单了解
- InnoDB其实是使用
页
为基本单位来管理存储空间的,默认的页大小为16KB
。- 对于InnoDB存储引擎来说,每个索引都对应着一棵B+树,该B+树的每个节点都是一个数据页,数据页之间不必要是物理连续的,因为数据页之间有双向链表来维护着这些页的顺序。
- InnoDB的聚簇索引的叶子节点存储了完整的用户记录,也就是所谓的索引即数据,数据即索引。
为更好管理页,InnoDB 提出表空间(table space)概念,它是抽象概念,可对应文件系统中一个或多个真实文件(不同表空间对应文件数量或不同)。每个表空间可划分为多个页,表数据存于表空间下的部分页中。 这里表空间有几种不同的类型:
- 系统表空间(system tablespace)——
ibdata1
默认情况下,InnoDB会在数据目录创建一个 12M 的 ibdata1
文件,它是系统表空间在文件系统的体现。该文件可自扩展,空间不足时会自动增大。如果想让系统表空间对应多个文件,或不喜欢 ibdata1
这个默认的文件名,那可以在MySQL启动时配置对应的文件路径以及它们的大小,比如这样修改一下 my.cnf
配置文件:
[server]
innodb_data_file_path=data1:512M; data2:512M : autoextend
该配置意味着 InnoDB 表空间会使用两个数据文件 data1
和 data2
,它们初始大小均为 512MB,并且在数据存储需求增长时,文件会自动扩展data2
文件的大小。
注意,一个 MySQL 实例仅有一份系统表空间。在 MySQL 5.5.7 至 5.6.6 版本间,表数据默认存储于此系统表空间。
- 独立表空间(file-per-table tablespace)——
ibd
从 MySQL 5.6.6 版本起,InnoDB 不再默认将表数据存于系统表空间,而是为每个表创建独立表空间,即创建多少个表就有多少个独立表空间。使用独立表空间存储表数据时,会在表所属数据库的子目录下创建以 .ibd
为扩展名、与表名相同的文件来表示该独立表空间。 完整的文件名称长这样:
表名.ibd
比方说我们在test数据库下创建一个名为users的表的话,那么在该表所在数据库对应的test目录下会为users表创建这两个文件:(mysql 5.7)
[root@db57 test]# ll
total 144
-rw-r----- 1 mysql mysql 65 May 2 09:38 db.opt
-rw-r----- 1 mysql mysql 8692 May 2 09:39 users.frm
-rw-r----- 1 mysql mysql 131072 May 2 09:39 users.ibd
其中 test.ibd
文件就用来存储test表中的数据和索引。
可以指定使用
系统表空间
还是独立表空间
来存储数据,这个功能由启动参数innodb_file_per_table
控制,比如说想将表数据都存储到系统表空间时,可以在启动MysQL服务器的时候这样配置:[server] innodb_file_per_table=0 # 0:代表使用系统表空间 # 1:代表使用独立表空间
查看默认配置项:
mysql> show variables like 'innodb_file_per_table'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+ 1 row in set (0.01 sec)
注意:
innodb_file.per_table
参数的修改只对新建的表起作用,对于已经分配了表空间的表并不起作用。如果我们想把已经存在系统表空间中的表转移到独立表空间,可以使用下边的语法:ALTER TABLE 表名 TABLESPACE [=] innodb_file_per_table ;
或者把已经存在独立表空间的表转移到系统表空间,可以使用下边的语法:
ALTER TABLE 表名 TABLESPACE [=] innodb_system ;
从 MySQL 8 开始,.frm
文件不再存在,这是因为 MySQL 8 对元数据存储进行了重大改进,相关信息的存储位置发生了变化。
Oracle官方将
.frm
文件的信息及更多元数据整合到**序列化字典信息(Serialized Dictionary Information,SDI)**中,这些信息被写入ibd
文件内部,即表结构、索引等关键元数据均以SDI的形式存储在对应表的ibd
文件内。为方便从
ibd
文件中提取SDI信息,Oracle专门提供了应用程序ibd2sdi
。该工具能够解析ibd
文件,将其中的SDI信息提取出来,转换为JSON格式的数据,以便用户查看或用于恢复元数据等操作。这个工具不需要下载,MySQL8自带的有,只要配好环境变量就能到处用。
到存储ibd文件的目录下,执行下面的命令:
ibd2sdi --dump-file = users.txt users.ibd
使用这个,命令语句会生成一个
.ibd
的一个.txt
文件。通过查看文件可以发现,MySQL8把之前版本的frm文件合并到ibd文件中了。
MyISAM存储引擎模式
在存储表结构方面,MyISAM和InnoDB一样,也是在数据目录下对应的数据库子目录下创建了一个专门用于描述表结构的文件:
表名.frm
在MyISAM中的索引全部都是二级索引,该存储引擎的数据和索引是分开存放的。所以在文件系统中也是使用不同的文件来存储数据文件和索引文件,同时表数据都存放在对应的数据库子目录下。假如users表使用MyISAM存储引擎的话,那么在它所在数据库对应的tese目录下会为users表创建这三个文件:
users.frm # 存储表结构
users.MYD # 存储数据 (MYData)
users.MYI # 存储索引 (MYIndex)
其中
users.MYD
代表表的数据文件,也就是我们插入的用户记录。采用独立表存储模式,每个表对应一个MYD文件;users.MYI
代表表的索引文件,我们为该表创建的索引都会放到这个文件中。
MySQL8版本中,进入数据库目录查看对应文件内容如下:
users_390.sdi # 存储元数据
users.MYD # 存储数据
users.MYI # 存储索引
InnoDB引擎中,SDl与InnoDB用户表空间中的数据一起存储。而对于MyISAM和其他存储引擎,它被写入数据目录中的
.sdi
文件。
而且在MysQL8.0中,MyISAM存储引擎不提供分区支持。在以前版本的MySQL中创建的分区MyISAM表不能在MySQL 8.0中使用。
还有,在之前的数据库版本中,MyISAM引擎存在 frm
文件,但是在MySQL8之后也和InnoDB引擎一样去掉了,放入了sdi
文件中。
5.3 视图在文件系统中的表示
和数据表一样,描述视图结构的文件也会被存储到所属数据库对应的子目录下边,只会存储一个视图名 .frm
的文件。
综上所述,深入理解 MySQL 元数据对于数据库的高效管理和维护至关重要。从元数据的操作到 SHOW 命令的运用,从 information_schema 库的查询到文件系统表示的了解,每一个知识点都相互关联,共同构成了 MySQL 数据库管理的重要体系。希望通过本文的介绍,能更好地了解 MySQL 元数据相关知识,在实际操作中更加得心应手。