-
Mysql架构
- 架构图
- 连接层
- 建立TCP连接、维护连接、校验账号密码、权限等
- server层
- SQL接口:主要负责接收需要执行的SQL,和返回SQL的执行结果
- 查询缓存:每次执行查询语句会以SQL为key将查询结果储存到缓存中,下次查询只要SQL完全匹配就直接返回缓存结果,如果执行的是增删改会将涉及的表的缓存删除。查询缓存默认在5.7关闭状态,由于需要完全匹配SQL(大小写、空格、动态参数)导致命中率低。在8.0删除了查询缓存功能
- 解析器:将SQL按照关键字、语法解析成语法树、生成执行计划,中途有关键字、语法错误直接通过SQL接口返回
- 优化器:使用多种策略和算法选择最优执行计划,包含顺序扫描、索引扫描、范围扫描、嵌套、循环连接哈希连接等。优化器在选择最优执行计划时,还会根据连接表的数量、查询条件的复杂性、字段排序、分组等。最后将执行计划交给执行器执行
- 执行器:调用存储引擎执行SQL语句
- 引擎层:
- innodb、myisam、memory等
- innodb和myisam区别:innodb支持行锁 支持事务 支持聚簇索引 支持外键,myisam支持表锁 不支持事务 只支持非聚簇索引 不支持外键
- 缓冲池:MySQL的缓冲池不仅InnoDB实现了,其他存储引擎如MyISAM也实现了自己的缓冲池机制。但是,通常我们谈论的MySQL缓冲池主要指InnoDB缓冲池,因为InnoDB是MySQL的默认存储引擎,并且在许多方面相比MyISAM有更好的性能和特性。 InnoDB的缓冲池称为InnoDB Buffer Pool,它是一个内存区域,用于存储最近访问过的数据页和索引页。通过将常用的数据和索引存放在内存中,可以减少磁盘I/O操作的次数,从而提高数据库的整体性能。 MyISAM也有自己的缓冲机制,称为MyISAM Buffer。MyISAM Buffer主要用于存储MyISAM表的索引和数据块,以提高查询性能。
- InnoDB存储结构:
- 结构图:
- 结构图:
- 表空间:由数据段、索引段、回滚段构成,一个表对应的一个.ibd文件即一个表空间
- 段:将叶子节点所在区存放在一起构成数据段、将非叶子节点区存放一起构成索引段
- 区:一个区会分配64个连续的16KB大小的页,也就是1M大小
- 页:InnoDB底层最小的存储单位默认16KB大小
- File_Header 文件头:
- FIL_PAGE_OFFSET:页号可以确定唯一页
- FIL_PAGE_TYPE:页类型(undo页、事务页、系统页、索引页)
- FIL_PAGE_PREV和FIL_PAGE_NEXT:上一页号、下一页号
- FIL_PAGE_SPACE_OR_CHKSUM:页的校验和
- FIL_PAGE_FILE_FLUSH_LSN:记录最后更改日志偏移量
- FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID:页属于哪个空间
- File_Trailer 文件尾:校验页是否完整
- Page Header 页头:记录的状态信息
- User_Records 数据行:从小到大有序数据单向链表
- 行格式:变长字段列表、null值列表、记录头信息、真实记录(内含三个隐藏列:trx_id、row_id、roll_pointer:指向更新这个事务之前生成的undolog)、其他信息
- 变长字段列表:
- null值列表:
- 记录头信息:
- 预留位1:
- 预留位2:
- delete_flag:删除标识
- min_rec_flag:最小记录为1,其他用户自己添加的都为0
- n_owned:和页的文件目录有关系
- head_no:自动两天隐藏记录为0、1最小、最大记录,然后用户自己的记录从2开始累计
- record_type:记录类型:0-普通记录,1-非叶子节点记录,2-最小记录,3-最大记录
- next_record:下条记录的相对位置
- trx_id:事务ID
- row_id:行唯一ID
- roll_pointer:指向更新这个事务之前生成的undolog
- 其他信息:
- Free_Space 空闲空间:剩余空间
- Page Directory 文件目录:存储多个组数据:存储形式为每组最小主键和该组的一行数据
- 由于页内数据为单向链表形式存储,增删快,查询慢为了加快检索速度就做了目录页,通过二分法主键来找到对应的槽位再检索内部数据
- 所以通过主键检索就会直接走二分法,非主键就会全表扫描
- Infimum+Supremum 最大最小记录:这两个记录是虚拟记录它们对应行格式中page_no为0,1
- File_Header 文件头:
- 存储层:对上层服务提供最基础的文件服务,如日志、数据、索引等文件的支持
- 架构图