浅谈MySQL的总体架构

前言

又是新的一周,各位周一好。缓存

因为换工做,找房子这一系列事情都推在了一块儿,因此最近停更了一个多月。如今全部的事情都已尘埃落定,我也能够安安静静的码字啦。安全

好了,也很少说,开始新的征程啦。最近一直在看《MySQL技术内幕——InnoDB存储引擎》这本书,也正好记录下吧。bash

总体架构图

咱们先看一下MySQL的架构图,对其先有一个总体的了解。MySQL主要分为四层架构,分别是网络链接层,服务层,存储引擎层,物理层。咱们日常写的SQL语句,以及对SQL语句的优化都在服务层,他其实就是遵循必定的原则使得SQL语句可以按咱们的预期效果执行。服务器


各部分介绍

网络链接层

主要负责链接管理,受权认证,安全等。每一个客户端链接都对应着服务器上的一个线程。服务器上维护一个线程池,避免为每一个链接建立和销毁线程。当客户端链接到MySQL服务器时,服务器对其进行认证。能够经过用户名与密码认证,也能够经过SSL证书进行认证。登陆认证后,服务器还会验证客户端是否有执行某个查询的操做权限。这一层并非MySQL所特有的技术。网络

服务层

该层是MySQL的核心,包括查询缓存,解析器,解析树,预处理器,查询优化器。架构


  • 查询缓存
在正式查询以前,服务器会检查查询缓存,若是能找到对应的查询,则没必要进行查询解析,优化,执行等过程,直接返回缓存中的结果集。
  • 解析器和预处理器
MySQL的解析器会根据查询语句,构造出一个解析树,主要用于根据语法规则来验证语句是否正确,好比SQL的关键字是否正确,关键字的顺序是否正确。

而预处理器主要是进一步校验,好比表名,字段名是否正确等。优化

  • 查询优化器
查询优化器将解析树转化为查询计划,通常状况下,一条查询能够有不少种执行方式,最终返回相同的结果,优化器就是找到这其中最优的执行计划
  • 执行计划
在完成解析和优化阶段后,MySQL根据相应的执行计划去调用存储引擎层提供的相应接口来获取结果。

存储引擎层

负责MySQL数据的存储和提取,是经过提供一系列的接口来屏蔽不一样引擎之间的差别。ui

注意:存储引擎是针对表的,而不是针对库。也就是说同一个库里面的不一样表能够拥有不一样的存储引擎。spa

常见的存储引擎有两种,MyISAM和InnoDB,下面咱们来看下他们的区别。线程

首先,咱们先建立一个存储引擎为MyISAM的test1表。

create table test1(
a INTEGER,
b varchar(10)
)ENGINE=MyISAM;复制代码

咱们能够去MySQL的相关目录看一下他实际存储的内容,发现他对应着三个文件。


其次,咱们再建立一个存储引擎为InnoDB的test2表。

create table test2(
a INTEGER,
b varchar(10)
)ENGINE=INNODB;复制代码

咱们再去看一下他实际存储的内容,发现他对应这一个文件。


那么问题就来了,他的数据文件和索引文件存放在哪里啦。这边先留个问题,下下篇"文件"再说。

物理层

将数据存放在硬盘上。

总体流程

咱们发送一条SQL语句,其在MySQL中的总体流程到底是什么样的?

  • 用户先经过Navicat等客户端与服务端创建链接,这边须要用户名和密码进行认证,也能够用SSL证书进行认证。
  • 登陆成功后,MySQL会根据相应权限来判断该角色是否拥有一些表的权限等。
  • 若是拥有相关权限,当用户发送一条查询select语句时,MySQL先查询缓存,若是已经有这条语句的缓存,则直接返回,若是没有则执行下面的流程。若是是更新update,新增insert,删除delete则不查询缓存,直接执行下面的流程。
  • MySQL会将SQL语句解析为树,而后对其进行校验,好比关键字是否正确,关键字顺序是否正确,表名是否正确,字段是否正确等。若是认证没有成功,则直接返回错误。若是认证成功了,则直接下面流程。
  • MySQL对解析树进行查询优化,由于多个SQL可能表达的意思同样,可是消耗的时间可能差异很大。因此MySQL对针对表的存储引擎找到最优的语句执行,也就是生成相应的执行计划。
  • 使用上面生成的执行计划,来调用存储引擎层的接口。也就是咱们平时使用的explain,其能够用来查看是否走索引,消耗的时间等信息。
  • 不一样的存储引擎会到相应的物理存储位置,找到相应的数据,封装并返回结果。
  • 若是拿到告终果集,而且为select语句,MySQL会将结果放入到缓存中,避免下次再进行相同的操做而形成资源的消耗,同时返回给客户端结果,至此,一条SQL语句的执行过程结束啦。
相关文章
相关标签/搜索