前言整理了一些Mysql数据库相关流程图/示意图,做笔记,大家一起学习。一、mysql主从复制示意图mysql主从复制原理是大厂后端面试的高频题。了解mysql主从复制的原理是非常有必要的。主从复制的原理,简单来说就是三步走,如下:master数据库有一个bin-log二进制文件,里面记录了所有的Sql语句的增删改查。(binlogthread)从数据库中复制主库bin-log文件的sql语句。(io线程)从数据库的relay-log重做日志文件中再次执行这些SQL语句。(sql执行线程)如下图所示:上图中的主从复制分为五个步骤:第一步:将主库的更新事件(update、insert、delete)写入binlog。第二步:发起从库到主库的连接。Step3:此时主库创建一个binlogdump线程,将binlog的内容发送给从库。第四步:从库启动后,创建I/O线程从主库读取binlog内容,写入relaylog。第五步:也会创建一个SQL线程,从relaylog中读取内容,从Exec_Master_Log_Pos位置执行读取更新事件,并将更新内容写入slavedb。2.Mysql逻辑架构图如果你能在脑海中构建一个MySql的各个组件如何协同工作的架构图,将有助于你深入理解MySql服务器。Mysql逻辑架构图主要分为三层:1)第一层负责连接处理、授权认证、安全等,每个客户端连接都会在服务器进程中有一个线程,服务器维护一个线程池,所以不需要每个客户端连接。一个新的连接创建或销毁线程。当客户端连接到Mysql服务器时,服务器会通过用户名和密码身份验证或通过SSL证书对其进行身份验证。客户端连接后,服务器会继续验证客户端是否有权执行特定查询。2)第二层负责编译和优化SQL这一层包括查询解析、分析、优化、缓存和所有内置功能。对于SELECT语句,在解析查询之前,服务器首先检查查询缓存,如果在那里可以找到对应的查询结果,则直接返回查询结果,而不进行查询解析和优化等进一步处理。所有跨存储引擎功能都在这一层实现:存储过程、触发器、视图。3)第三层是存储引擎。存储引擎负责在MySQL中存储和提取数据。存储引擎通过API与上层通信,这些API屏蔽了不同存储引擎之间的差异,使这些差异对上层查询过程透明。存储引擎不会解析SQL,不同的存储引擎之间也不会相互通信,只是简单的响应上层服务器的请求。3.InnoDb逻辑存储结构图从InnoDb存储引擎的逻辑存储结构来看,所有数据在逻辑上都存储在一个空间中,称为表空间(tablespace)。表空间由段、区和页组成。在某些文档中,页面有时被称为块。InnoDB逻辑存储结构图如下:表空间(tablespace)表空间是Innodb存储引擎逻辑的最高层,所有的数据都存储在表空间中。Innodb存储引擎默认有一个共享表空间ibdata1,即所有数据都存储在这个表空间中。如果启用了innodb_file_per_table参数,需要注意的是每个表的表空间中只存储数据、索引和insertbufferBitmap,其他类型的数据,如回滚(undo)信息,insertbuffer检索页,而系统事务信息、二级写缓冲区等仍然放在原来的共享表中。段表空间由段组成。公共段包括数据段、索引段和回滚段。InnoDB存储引擎表是索引组织的,所以数据就是索引,索引就是数据。数据段是B+树的叶子节点,索引段是B+树的非索引节点。在InnoDB存储引擎中,段管理由引擎自己完成,DBA不能也不需要去控制。范围范围是由连续页组成的空间,每个页的大小为1MB。为了保证zone中page的连续性,InnoDB存储引擎一次从磁盘申请4到5个zone。默认情况下,InnoDB存储引擎页面大小为16KB,一个区域中有64个连续的区域。页(page)页是InnoDB磁盘管理的最小单位。在InnoDB存储引擎中,每页的默认大小为16KB。从InnoDB1.2.x版本开始,页面大小可以通过参数innodb_page_size设置为4K、8K、16K。在InnoDB存储引擎中,常见的页类型有:数据页、撤销页、系统页、事务数据页、插入缓冲区位图页、插入缓冲区空闲列表页等。4.Innodb页结构示意图Innodb页结构单体InnoDB数据页由以下7个部分组成,如图:其中,FileHeader、PageHeader、FileTrailer的大小是固定的,分别是38、56、8个字符section,这些空格是用来标记页面的一些信息,比如Checksum,数据页所在B+树索引的层数等。UserRecords,FreeSpace,PageDirectory是实际的行记录存储空间,所以大小是动态的。下面我们用一个表格来大致描述一下这7个部分:页面中的记录存储流程图每当我们插入一条记录时,我们都会从FreeSpace部分申请一个记录大小的空间,也就是未使用的存储空间划分为UserRecords部分,当FreeSpace部分的空间完全被UserRecords部分所取代时,就意味着该页面用完了,如果有新的记录要插入,就需要申请一个新的页面。这个过程图如下:由不同的Innodb页面组成的数据结构图一个表中可以有几千条记录,而一个页面只有16KB,所以可能需要很多页来存储数据。不同的页面实际上构成了一个双向链表。文件头是InnoDB页面的第一部分。它的FIL_PAGE_PREV和FIL_PAGE_NEXT分别代表本页的上一页和下一页的页码,即链表的上一个和下一个节点指针。5.Innodb索引结构图先来看一个数据表示例,假设Col1为主键,如下:B+树聚簇索引结构图聚簇索引是以主键创建的索引聚簇索引将数据存储在叶子节点中的表非聚集索引结构图假设索引列为Col3,则索引结构图如下:非聚集索引是使用非主键创建的索引。非聚集索引在叶节点中存储主键和索引列。在使用非聚集索引查询数据时,通过获取叶子上的主键来查找要查找的数据。(找到主键再查找的过程称为回表)假设查询的列恰好是索引对应的列,不需要回表查,那么该索引列称为覆盖索引。InnoDBLockTypeMindMapLockingMechanism乐观锁和悲观锁是并发控制的两种思想,可以用来解决丢失更新的问题。乐观锁每次去取数据的时候都是很乐观的,感觉不会有并发问题。因此,访问和处理数据并不是每次都被锁定。但是更新的时候根据版本号或者时间戳判断是否有冲突,有就处理,没有就提交事务。悲观锁每次去取数据的时候都很悲观,认为会被别人修改,会出现并发问题。因此,在访问和处理数据之前加一个排它锁。数据在整个数据处理过程中都处于锁定状态,事务提交或回滚后释放锁。锁粒度表锁:开销小,加锁速度快;强锁,锁冲突概率高,并发度最低;没有僵局。行锁:开销大,加锁慢;会出现死锁;加锁粒度小,锁冲突概率低,并发度高。页锁:开销和加锁速度介于表锁和行锁之间;会出现死锁;锁粒度介于表锁和行锁之间,并发性基本兼容。共享锁:也称为读锁(S锁))。一个事务获取共享锁,其他事务可以获取共享锁,但不能获取排它锁,其他事务可以进行读操作,但不能进行写操作。SELECT...LOCKINSHAREMODE显示加共享锁。独占锁:又称写锁(X锁)。如果事务T对数据A加了排他锁,其他事务就不能再对A加任何类型的锁。被授予排他锁的事务既可以读取也可以修改数据。SELECT...FORUPDATE显示添加独占锁。LockmodeRecordlock:在行对应的索引记录上加锁,锁定一条行记录。间隙锁:是在索引记录区间上加锁,锁定一个区间。next-keylock:是记录锁和索引记录前间隙上的锁的组合,锁定行记录+区间。意向锁旨在支持多个粒度锁的同时存在。
