MySQL 数据目录
MySQL 数据目录结构
MySQL 服务器程序在启动时会到文件系统的某个目录下加载一些文件,之后在运行过程中产生的数据也都会存储到这个目录下的某些文件中,这个目录就称为数据目录,它对应一个系统变量 datadir:
可以看到,我电脑上的 MySQL 数据目录为 /Users/luyee/apps/mysql/data/
。
数据库在数据目录中的表示
每个数据库都对应数据目录下的一个子目录,比如我创建了一个 test 数据库:
可以看到数据目录下确实多了个 test 子目录,除此之外,还能看到有 mysql
、performance_schema
、sys
这几个数据库,我们连接到 MySQL 查询所有数据库确认下:
仔细看的话,发现除了 information_schema
这个系统数据库外,其他的数据库在数据目录下都有对应的子目录,这是因为 MySQL 的开发者对 information_schema
的进行了特殊对待。
我们回到刚刚创建的 test 数据库,查看 test 子目录,发现其下存在一个名为 db.opt
的文件,这个文件用来存储该数据库的各种元数据,如该数据库的默认字符集和默认字符比较规则:
表在数据目录中的表示
每张表的数据可以分成两个部分:
表结构定义
表中的数据
在 InnoDB 中,数据库子目录下的 <表名>.frm 文件
就是表结构定义文件,`<表名>.ibd 文件`是存储表中数据的文件,比如我们在 test 数据库下创建一个 index_demo 表:
InnoDB 是如何存储表数据的
我们已经知道 InnoDB 是以页为单位来管理存储空间的,为了更好地管理这些页,InnoDB 开发者提出了一个表空间(table space)的概念,这是一个抽象的概念,一个表空间对应了文件系统上的一个或多个真实文件。
表空间分为以下类型:
视图在数据目录中的表示
MySQL 视图是一种虚拟表,定义了从一个或多个表中提取数据的查询。它不存储数据本身,只是保存了查询逻辑,用来简化复杂查询,避免每次都编写复杂的查询语句。
由于视图不存储数据本身,因此只需要把它的结构存储起来就行了,即存储到数据库子目录的 <视图名>.frm 文件
。
其他文件在数据目录中的表示
除了我们上面提到的文件,数据目录还存储了一些程序运行需要的文件,如:
(1) 服务器进程文件:<hostname>.pid
(2) 服务器日志文件
MySQL 错误日志文件:
<hostname>.err
(3) 自动生成的SSL和RSA证书和密钥文件 :ca.pem、ca-key.pem、client-key.pem、client-cert.pem、server-key.pem、server-cert.pem、private_key.pem、public_key.pem
(4) 自动生成的配置文件:auto.cnf
(包含 MySQL 服务器的 UUID,用于 MySQL 的复制和集群功能)
(5) InnoDB 独有文件
缓冲池文件:
ib_buffer_pool
,用于缓存数据库页,减少磁盘 I/O,从而提高数据库性能。可以通过innodb_buffer_pool_size
参数设置 InnoDB 缓冲池的大小,可以通过innodb_buffer_pool_instances
参数将缓冲池划分为多个实例,以减少竞争并提高性能InnoDB redo log 文件:
ib_logfile0
和ib_logfile1
,记录了对数据库的所有修改操作,以便在系统崩溃时进行数据恢复。可以通过innodb_log_file_size
参数调整 redo log 文件的大小,也可以通过innodb_log_files_in_group
参数来增加日志文件的数量
文件系统对 MySQL 的制约
数据库名称和表名称受文件系统最大长度限制
文件长度受文件系统最大长度限制
特殊字符的问题:MySQL 会自动把除数字和字母以外的字符转化成
@Unicode编码
的形式,如创建一张名叫`用户表`的表,其表空间文件为:@7528@6237@8868.frm
和@7528@6237@8868.ibd