数据库是数据的集合,数据库管理系统(DBMS)是操作和管理数据库的应用程序。数据库应用主要有两类:OLAP(联机分析处理)和OLTP(联机事务处理)。
OLAP的主要特点是:
- 实时性要求不高
- 数据量大
- 并发量小
OLTP的主要特点是:
- 实时性要求高
- 数据量小
- 高并发
- 要求满足ACID
Mysql体系架构
mysql是一种DBMS,其体系架构如下图所示:
mysql中集成的是插件式的存储引擎,InnoDB引擎是其中之一。存储引擎基于表而不是数据库:同一个数据库中根据不同表的访问操作需求可以选择不同的存储引擎。
InnoDB引擎
InnoDB引擎主要面对OLTP类应用。
InnoDB引擎在mysql中处于文件和文件系统的上层,管理着对InnoDB引擎表的访问和更新。
InnoDB引擎逻辑存储结构
数据需要在一定的数据结构和组织结构下才能进行有效的管理。InnoDB表中的每行数据是基于B+树存储的,其中B+树中的顺序依据是主键的顺序,称为索引组织表。B+树存储在数据文件中,在B+树之外,InnoDB对数据文件中数据的管理和组织定义一个新的逻辑结构如下图所示:
所有的数据都被逻辑地存放在表空间中,对于整个数据库中的InnoDB表,可以共用一个表空间,也可以将表空间拆分为共享表空间和各个表私有的表空间。拆分后,私有表空间仅存储该表的数据、索引、和插入缓冲BitMap页,其他类的数据如回滚(undo)信息、系统事务信息等还是存储在共享表空间里。
共享表空间文件格式:
私有表空间文件格式:
表空间中的数据分类为各个段:数据段、索引段、回滚段等。为了 便于管理,在各个段中继续拆分为区,区再细化拆分为连续的页,页是InnoDB磁盘管理的最小单位(即InnoDB从磁盘读取和写入都是以页为单位进行的)。页中按关系表中的行来存储实际的关系数据。
在InnoDB中,表的数据均存储在B+树的叶子节点上,数据也是索引的一部分,即聚集索引。
InnoDB索引页的文件格式:
先看FIL Header:
FIL Header中包含了索引页作为文件的信息。存储了指向上个页和下个页的指针,即索引页之间是通过链表连接起来的;同时还存储了该页的LSN(Log Squence Number),用于支持CheckPoint。
再看INDEX Header:
INDEX Header中包含了对于索引页作为索引的信息。存储了索引页中记录的数量,索引节点的类型(根节点、非叶结点、叶结点),页目录槽数(Page Directory)等信息。
然后就是User Records行记录了,存储了B+树索引非叶节点数据和叶结点数据,从图中可以看出User Records在物理上并不有序,但是逻辑上是以单链表有序的,顺序为主键顺序。
最后来看页目录(Page Directory)。User Records是以单链表组织的,一个页的大小是16K,最多可以存储近8000行数据,查询某一个行时需要顺序遍历所有行,引入Page Directory对User Records进行二分查找,提高页内数据查询效率,如下图所示:
最终,以表、段、区、页的逻辑结构为载体,构建出InnoDB表B+树的逻辑结构如下图:
Mysql相关文件
参数文件
mysql数据库的配置文件,包含了各类系统参数。
日志文件
mysql中常见的日志文件:
- error log:记录了mysql启动、运行、关闭过程。
- binary log:记录了对mysql数据库执行更改(不包含查询)的所有操作。
- slow query log:记录执行超过指定时间值的SQL语句。
- query log:记录所有对mysql数据库请求的信息。
表结构文件
无论选用什么存储引擎,mysql会对定义的表和视图生成(表名.frm)文件用以存储表和视图的结构定义。
以下为InnoDB引擎的文件:
表空间文件
- 共享表空间文件:ibdata1
- 私有表空间文件:表名.ibd
redo log文件
ib_logfile0 与 ib_logfile1,用于支持事务的持久性。
MySQL技术内幕 InnoDB存储引擎 第2版
https://blog.jcole.us/innodb/
mysql 官方手册