数据库 | 001-MySQL梳理系列(一)

MySQL基本组成

SQL执行流程

  • Server 层主要包括连接器、查询缓存、分析器、优化器、执行器,包含了MySQL主要的很多核心功能,以及所有的内置函数、存储过程、触发器、视图等,其实就是所有跨存储引擎的功能都是在这一层实现的
  • 存储引擎层,主要负责数据的存储和读取,是以插件的形式存在的 ,支持如 InnoDBMyISAMMemory 等多个存储引擎,现在默认为 InnoDB

查询缓存

  • 当一个SQL执行时首先会进入查询缓存
  • 查看之前是否执行过该语句,如果执行过则会以key-value的形式保存在缓存中,key是查询语句,value是查询结果
  • 如果缓存命中则直接返回结果,如果查询语句不在缓存中继续后面的流程
  • 大多数情况下我们不推荐使用查询缓存 ,因为缓存失效非常频繁,只要一个更新,那么这个表上所有的缓存都会失效,吐过数据的更新比较多,那么缓冲命中的效率很低,不断的在失效
  • 在MySQL中提供了参数 query_cache_type 参数来设置,默认是 DEMAND ,表示对默认的SQL都不使用查询缓存,如果要对特的语句进行缓存查询,则可以使用 SQL_CACHE 来显示的指定,如 select SQL_CACHE * from T where ID=1;
  • 在MySQL8.0 开始,查询缓存整个功能模块已经删除掉不再拥有

分析器

  • 分析器主要包含 词法分析语法分析
  • 词法分析主要分析一条SQL中各个字符串代表什么,比如 select 标记出来,这就是一个查询,在具体的表名,查询 的字段等等全部分析出来
  • 语法分析主要是分析SQL语句是否符合MySQL的规范,如果我们SQL写的有问题,那么经常看到的一个异常就是 You have an error in your SQL syntax 的提示

优化器

join

执行器

  • 首先校验是否有对这张表的访问权限,如果没有权限则会报错
  • 如果有,则根据引擎接口打开表进行数据的查询筛选

Buffer Pool

128MB
my.ini

[server]

数据页

  • MySQL中对数据进行抽象,按照数据页的形式来存放到文件,当查询时,首先定位到要查询数据所在的数据页,之后将整个数据页加载到 Buffer Pool 中,
  • 数据页默认的大小是 16KB , 也就是一页数据包含 16KB 的数据
  • BufferPool 中的数据页一般我们叫缓存页,默认情况下缓存页与磁盘上的数据页大小是对应的
  • 对于每个缓存页都有一个描述信息
  • 描述信息包括:数据页的所属表空间,数据页的标号,这个缓存页在 Buffer Pool 中的内存地址以及其他一些信息
  • Buffer Pool 中,所有的描述信息都在最前面,然后各个缓存页放在后面

  • 描述数据大小相当于缓存页大小的 5% 左右,也就是大概 800 字节,所以当我们设置 buffer pool 的大小为 128MB ,但是实际上 Buffer Pool 的真实大小会超出一些,可能有有 130MB 左右,这多出来的就是每个缓存页的描述信息

表空间

表名.ibd
表名.ibd

数据区

  • 在表空间中有太多的数据页不好管理,这是引入了 数据区 的概念,英文: extent
  • 一个数据区中有连续的 64 个数据页,每个数据页 16kb , 所以每个数据区大小是 1MB
  • 同时 265 个数据区被划分为一组
  • 在表空间中 第一组 数据区的 第一个数据区前三个数据页 是固定的,存放一些特殊的描述性的信息

    • FSP_HDR 数据页: 存放一些表空间和这一组数据区的属性
    • IBUF——BITMAP 数据页:存放这组数据页所有的 insert buffer 的一些信息
    • INODE 数据页:存放一些特殊信息
  • 表空间中其他各组数据区的第一个数据区的头两个数据页都是存放特殊信息的

本文由AnonyStar 发布,可转载但需声明原文出处。

欢迎关注微信公账号 :云栖简码 获取更多优质文章

更多文章关注笔者博客 : 云栖简码 i-code.online