【从零开始的mysql】MySQL系统架构及执行原理

MySQL系统架构及执行原理

文章内容输出来源:拉勾教育Java高薪训练营;

mysql体系架构

【从零开始的mysql】MySQL系统架构及执行原理_第1张图片

网络连接层

提供与mysql服务器建立连接的支持,目前几乎支持所有主流的服务编程技术,通过各自api与mysql建立连接

服务层

服务层主要包括:

  • 连接池: 负责存储和管理客户端的数据库连接,一个线程负责管理一个连接
  • 系统管理和控制工具: 备份恢复,安全管理,集群管理等
  • sql接口: 用于接收客户端发送来的sql命令,并返回结果
  • 解析器: 负责将sql解析成解析树,然后根据mysql规则进行进一步检查解析树是否合法
  • 查询优化器: 当解析树通过解析器语法检查后,交给优化器将其转化成执行计划,然后与存储引擎交互

例如:select id,name from user where age= 12;
1.优化器会先进行where条件过滤,
2.然后再根据查询的属性(就是这里的sql查询字段id,name)进行属性投影,
3.将之前的过滤后的结果和投影的结果联接生成结果

  • 缓存: 由一系列小缓存注册,如表缓存,记录缓存,权限缓存,引擎缓存等,如果在缓存中能够命中查询结果,就可以直接从缓存中获取数据
存储引擎层

负责mysql中数据存储和提取,与系统文件层进行交互,服务器的执行引擎通过接口与存储引擎进行通信。

系统文件层

主要负责将数据文件和日志文件存储在文件系统上,并完成与存储引擎的交互,是文件的物理存储层。主要包含日志文件,数据文件,配置文件,pid,socket文件等

  • 日志文件:
    • 错误日志:默认开启 show variables like '%log_error%'
    • 通用查询日志:记录查询语句 show variables like '%general%'
    • 二进制日志:记录对数据库的修改操作,语句发生时间,执行时长,但是不记录select、show等不修改数据库的sql,主要用于数据库恢复和主从复制
      show variables like '%log_bin%' //是否开启
      show variables like '%binlog%' //参数查看
      show binary logs //查看日志文件
    • 慢查询日志 :记录执行时间超时的查询sql,默认10s
      show variables like '%slow_query%' //是否开启
      show variables like '%long_query_time%' //时长
  • 配置文件: 用于存放配置信息(即my.cnf、my.ini文件)
  • 数据文件: 存储在磁盘上数据库文件
    • db.opt文件: 记录数据库的默认使用的字符集和校验规则
    • frm文件: 存储与表相关的元数据信息,表结构定义信息,每张表都会有一个frm文件
    • MYD文件:myisam存储引擎的表数据信息,每张表对应一个.MYD文件
    • MYI文件:myisam存储引擎的索引信息,每张表对应一个.MYI文件
    • ibd和IBDATA文件:存放InnoDB的数据文件(包括索引),InnoDB存储引擎有两种表空间方式:独享表空间和共享表空间,独享表空间使用.ibd文件存放数据,每张InnoDB表对应一个.ibd文件。共享表空间使用.ibdata文件,所有表共同使用一个(或多个,自行配置).ibdata文件
    • ibdata1文件:系统表空间数据文件,存储表元数据,Undo日志等
    • ib_logfile0、ib_logfile1文件:Redo log日志文件
  • pid文件: mysql在linux环境下的进程文件,存放自己进程id
  • socket文件: linux才有的,linux环境下客户端连接可以不通过TCP/IP网络而直接使用Unix Socket来连接mysql

mysql运行机制

【从零开始的mysql】MySQL系统架构及执行原理_第2张图片

建立连接

通过客户端/服务器通信协议与mysql建立连接,mysql客户端与服务端通信方式是“半双工”。
通讯机制:

  • 全双工:能同时发送和接收数据
  • 半双工:指某一刻要么发数据,要么接收数据,不能同时
  • 单工:只能发数据或者只能接数据

对于每一个mysql的连接,时刻都有一个线程状态来表示这个连接正在做什么。
查询线程信息show processlist;

查询缓存

如果开启了查询缓存,在查询过程中查询到完全相同的sql时,回将查询结果从缓存中直接返回个客户端(mysql 8已经废弃了这个功能)

解析器

将客户端发送的sql进行语法解析,生成解析树。预处理器根据mysql规则进一步检查解析树是否合法,例如检查数据表和数据列是否存在,还会解析名字和别名是否有歧义等,最后生成新的解析树

查询优化器

根据解析树生成最优的执行计划,mysql使用很多优化策略生成最优的执行计划,可以分为两类:静态优化(编译时优化),动态优化(运行时优化)

等价变换策略
1.5=5 and a>5会优化成 a>5
2.a5 and a=5
3.基于联合索引,调整条件位置等
函数优化
InnoDB引擎的min函数只需要找索引最左边
InnoDB引擎的max函数只需要找索引最右边
MyISAM引擎count(*),不需要计算可以直接返回
in优化
对in查询会先排序,再采用二分查找,例如where id in(2,1,3),变成in(1,2,3)
提前终止查询
使用了limit时,获取到limit所需数据后就不再遍历了

查询执行引擎执行sql

查询执行引擎会根据sql语句中表的存储引擎类型,以及对应的api接口与底层存储引擎或物理文件交互,得到结果返回客户端,如果开启了查询缓存,会将sql语句和结果保存到查询缓存中,一会再有相同的sql语句执行则直接返回结果

如果开启了查询结果,先将查询结果缓存
返回结果太多采用增加模式返回

你可能感兴趣的:(从零开始的mysql)