前言
这是一篇理论性比较强的文章,是不是很多人一听理论性的东西,就被劝退了?可千万别。其实分享内容非常简单,也非常干,相信你会喜欢的,对你也是有帮助的。切入正题,mysql的体系结构可以作为一般知识了解即可,让我们对mysql的工作流程有一个宏观的认识,毕竟对于大部分人来说,不需要我们去设计数据库,而是仅作使用。作为普通使用mysql的开发人员,mysql的逻辑存储结构才是关键重点。因为平时我们对使用mysql主要在于数据的存储与提取,如果能够了解,数据是库里按什么结构组织起来的,这对于如何高效使用mysql存取数据是非常有帮助的。
1. mysql的体系结构
1.1 连接池组件
连接池组件主要的作用就是用户连接的维护及管理,提升访问性能,另外就是角色权限认证,大多数基于网络的客户端 / 服务端的程序都有类似的结构,核心理念就是为了连接复用。
1.2 管理服务和工具组件
管理服务和工具组件主要是指系统管理和控制工具,例如备份恢复、Mysql 复制、集群等。
1.3 sql接口组件
sql组件用于接收用户的sql命令,并且返回sql执行后的结果。
1.4 查询分析器组件
对sql进行解析,语法验证,解析称为内部的数据结构(解析树)
1.5 优化器组件
优化器组件主要是对用户书写的sql进行优化,如索引的选择,表的读取顺序等。
1.6 缓冲组件
对结果进行缓存,包含表缓存,记录缓存,权限缓存,key缓存等。
1.7 插件式存储引擎
开发者可以选择合适的存储引擎,也可以定制化开发存储引擎,存储引擎是基于表的,不是数据库
1.8 物理文件
mysql中的数据最终会持久化到文件中。
2.InnoDB的特性
3.InnoDB的逻辑存储结构
3.1 表空间
从InnoDB存储引擎的逻辑结构看,所有数据都被逻辑地存放在一个空间内,称为表空间(tablespace),而表空间由段(sengment)、区(extent)、页(page)组成。表空间(Tablespace)是一个逻辑容器,表空间存储的对象是段,在一个表空间中可以有一个或多个段,但是一个段只能属于一个表空间。数据库由一个或多个表空间组成,表空间从管理上可以划分为系统表空间、用户表空间、撤销表空间、临时表空间等。在 InnoDB 中存在两种表空间的类型:共享表空间和独立表空间。如果是共享表空间就意味着多张表共用一个表空间。如果是独立表空间,就意味着每张表有一个独立的表空间,也就是数据和索引信息都会保存在自己的表空间中。独立的表空间可以在不同的数据库之间进行迁移。可通过命令查看当前系统启用的表空间类型。
mysql > show variables like 'innodb_file_per_table';
InnoDB把数据保存在表空间内,表空间可以看作是InnoDB存储引擎逻辑结构的最高层。本质上是一个由一个或多个磁盘文件组成的虚拟文件系统。InnoDB用表空间并不只是存储表和索引,还保存了回滚段、双写缓冲区等。
3.2 段
段(Segment)由一个或多个区组成,区在文件系统是一个连续分配的空间(在 InnoDB 中是连续的 64 个页),不过在段中不要求区与区之间是相邻的。段是数据库中的分配单位,不同类型的数据库对象以不同的段形式存在。当我们创建数据表、索引的时候,就会相应创建对应的段,比如创建一张表时会创建一个表段,创建一个索引时会创建一个索引段。
3.3 区
在 InnoDB 存储引擎中,一个区会分配 64 个连续的页。因为 InnoDB 中的页大小默认是 16KB,所以一个区的大小是 64*16KB=1MB。在任何情况下每个区大小都为1MB,为了保证页的连续性,InnoDB存储引擎每次从磁盘一次申请4-5个区。默认情况下,InnoDB存储引擎的页大小为16KB,即一个区中有64个连续的页。
3.4 页
页是InnoDB存储引擎磁盘管理的最小单位,每个页默认16KB;InnoDB存储引擎从1.2.x版本碍事,可以通过参数innodb_page_size将页的大小设置为4K、8K、16K。若设置完成,则所有表中页的大小都为innodb_page_size,不可以再次对其进行修改,除非通过mysqldump导入和导出操作来产生新的库。
innoDB存储引擎中,常见的页类型有:
- 数据页(B-tree Node)
- undo页(undo Log Page)
- 系统页 (System Page)
- 事物数据页 (Transaction System Page)
- 插入缓冲位图页(Insert Buffer Bitmap)
- 插入缓冲空闲列表页(Insert Buffer Free List)
- 未压缩的二进制大对象页(Uncompressed BLOB Page)
- 压缩的二进制大对象页 (compressed BLOB Page)
3.5 行
InnoDB存储引擎是按行进行存放的,每个页存放的行记录也是有硬性定义的,最多允许存放16KB/2-200,即7992行记录。