赞
踩
在学习MySQL理论知识之前,需要对MySQL分层有一个全面的了解。这样对MySQL知识体系有一个全面的了解。MySQL分层架构如图所示:
(1)客户端:各种语言编写的通信协议。例如Java的jdbc或者Druid连接池等,负责和MySQL服务端连接通信。
(2)MySQL服务层:主要包含连接器、SQL接口、解析器、优化器、存储引擎(Innodb)等。
(3)文件系统层:位于磁盘上,包含数据、索引与日志等。
其中MySQL服务层与磁盘文件之间有一个OS Cache(内核态内存),是性能和一致性的折中选择,后文会介绍。
重点:MySQL读(select)、写(update、insert、delete)操作都是在Innodb存储引擎的的缓冲池(Buffer Pool)中完成,并不会直接对磁盘数据进行操作。
结合图一可以知道MySQL服务层的核心组件,每个组件的具体功能如下:
(1)连接器:从连接池中取出连接对象建立连接,进行身份认证、权限授予等。
(2)SQL接口:负责接受SQL语句、等待接收执行语句的结果。
(4)解析器:对SQL语句进行词法分析、语法分析、生成语法树等。
(5)优化器:生成执行计划、例如索引选取、连接方式选择、查询条件顺序更改等。
(6)执行器:根据优化后的SQL语句调用存储引擎查询数据,将结果返回给SQL接口。
(7)**存储引擎:**MySQL存储引擎主要有MySAM、Innodb等,以插件的形式存在,当前主要使用Innodb。下文所有介绍都是基于Innodb存储引擎。
前六个知道大概做什么就行,数据库存储引擎是精华。后面会花大量篇幅介绍存储引擎(Innodb)。
Innodb核心组件如图所示,主要包括缓冲池(Buffer Pool)、写缓冲(Change Buffer)、日志缓冲(Log Buffer)等。自适应哈希(Adaptive Hash Index)可以自行了解,不重要。
前置知识:磁盘IO就是向磁盘读、写数据;落盘就是数据持久化到磁盘上。
缓冲池:主要是为了提高查询性能。Innodb将磁盘数据缓存到缓冲池中,避免每次数据访问都要进行磁盘IO来加速读、写请求。
写缓冲:主要是为了提高写性能,当数据不在缓冲池中时也可以不进行磁盘IO完成写操作。
日志缓冲:主要记录重做日志(redo Log),Innodb存储引擎特有,用于丢失数据恢复(崩溃恢复),保证数据安全。
MySQL数据以表空间(tablespace)、段(segment)、区(extend)、页(page)、行(row)存储。
大家可以参照下图简单理解数据的存储:
MySQL和磁盘之间进行数据交互就是以页为单位,因此本文只对页和行进行详细讲解。
页:Innodb默认一页是16KB的连续空间。页存放真实数据或者索引,同一页只能全为数据或者全为索引。
数据页格式及连接方式如下:
数据页中我们需要重点关注File Header中的页号、User Records、Page Directory。数据检索流程大概是根据检索条件判断数据所在页号,然后到对应页中根据Page Directory快速检索数据在User Records中链表上的具体位置。
数据添加及页分配:
行:一条数据记录,存储数据基本单位。由页中的User Records保存。
MySQL数据行有多种形式,本文仅介绍Compact格式。
记录额的外信息: | 隐藏字段: |
---|---|
变长字段长度列表(非必需): | roll_pointer:回滚指针,指向历史记录,以回滚段的形式存在。回滚链对用undo Log日志。 |
NULL值列表(非必需):如果字段中有允许为NULL的字段,则将这些字段是否为null的信息存储在NULL值列表中。NULL值列表占用1个字节。值得注意的是,NULL值列表页不是必须的,如果表中没有允许存储 NULL 的列,则不存在NULL值列表。 | trx_id:事务id,在视图读的MVCC中会用到 |
记录头信息:记录头详细信息已经在图中展示 | row_id:如果不存在逐渐就使用该字段替补主键id |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。