摘要
本文主关于 MySQL 框架的问题。主要涉及 InnoDB 引擎。
MySQL 目录结构
研究 MySQL 的目录,主要目的在于研究配置文件、数据目录、日志文件等。在 Linux 操作系统下,MySQL 目录结构如下:
配置文件:
/etc/my.cnf
这里包含所有 MySQL 的配置参数。如果要修改 MySQL 配置参数,则需要重启 MySQL
数据目录:
/var/lib/mysql
这里包含 MySQL 的表文件。每一个 DB 对应一个文件夹。
MySQL 逻辑框架
MySQL 逻辑框架指的是 MySQL 服务的逻辑。
包括:
Connectors
Connector 用来连接 MySQL
MySQL Server
MySQL Server 包括:Connection Pool 以及处理 SQL 语句的部分
Engine
MySQL Engine 用来管理数据。常用的 Engine 为 InnoDB
Disk
MySQL Disk 用来存储数据并接受 Engine 的管理。
InnoDB 引擎结构
InnoDB 用来管理数据。这里分为磁盘结构和内存结构。磁盘结构用来保存该表的相关信息,内存结构用来保存某个数据页的相关信息。
磁盘结构
系统表空间
ibdata1
1.数据字典
2.双写缓冲区
3.修改缓冲区,早期叫做插入缓冲区
对数据进行增删改操作时,辅助索引需要对应的进行更新操作。为了提高修改效率,辅助索引的变化先写入修改缓冲区暂存,然后更新到磁盘。
4.回滚段:保存 undo log,默认情况下回滚日志保存在系统表空间
用户表空间
保存 用户数据 的磁盘文件。
默认情况下,每个表都对应一个 用户表空间 就是 ibd 文件。
用户表空间的创建由 innodeb_file_per_table 控制。
默认时,该值是 true;如果设为 false,则所有用户表空间中的数据会被转存到 系统表空间 中去。
重做日志
保证数据不丢失的重要文件。
数据先写到 redo log 中,然后再转到磁盘中。
redo log 是顺序写,速度比直接写入磁盘快(写入磁盘是随机写)
在磁盘中,重做日志由两个文件保存:ib_logfile0 与 ib_logfile1。每个文件的大小都是 50M ,写入方式为循环写入。
内存结构
内存中保存数据页。MySQL Server 可对内存中的数据页进行增删改查。但最后会通过 checkpoint 写入到磁盘中。
Buffer Pool
mysql 读取数据的单位:页 (16K)
mysql 查询时,是以 页 为单位从磁盘中读取数据的。将一页数据读取到内存中,这样当需要该页中的其它数据时,不需要再次从磁盘中读取数据。
1.数据页
2.索引页
3.自适应hash索引(由 innodb 控制的索引)
4.修改缓存(Change buffer)用来保存需要修改的辅助索引。
log buffer(redo log 缓冲区)
redo log 记录了对数据操作的所有动作(增删改操作)。
日志信息放到内存中暂存,定时写入到磁盘的 redo log 中。
结论
本文主要介绍 InnoDB 引擎的主要构造。其中最重要的是 redo log。redo log 是保证数据不丢失的重要依据。
接下来的任务:
-
脏页落盘机制
-
InnoDB 引擎
附
售票系统中 分段售票 问题
这里的设计思路:建立一个存储 座位 的表。每列为乘车区间。当某人买了 A-D 的车票时,该座位中所有以B C 为起点,以 A,B,C 为终点的区间都被设为 “已出售”。