Mysql-架构

140 阅读4分钟
  • Mysql架构

    • 架构图 绘图1.png
    • 连接层
      • 建立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存储结构:
        • 结构图: image.png
      • 表空间:由数据段、索引段、回滚段构成,一个表对应的一个.ibd文件即一个表空间
      • 段:将叶子节点所在区存放在一起构成数据段、将非叶子节点区存放一起构成索引段
      • 区:一个区会分配64个连续的16KB大小的页,也就是1M大小
      • 页:InnoDB底层最小的存储单位默认16KB大小
        • File_Header 文件头:
          • FIL_PAGE_OFFSET:页号可以确定唯一页
          • FIL_PAGE_TYPE:页类型(undo页、事务页、系统页、索引页) image.png
          • 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
    • 存储层:对上层服务提供最基础的文件服务,如日志、数据、索引等文件的支持