热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

MySQL的架构组成

导读为了更深刻的理解MySQL的运行和架构组成,写下这篇博客便于以后进行复习,你可以在这篇博客中学习到:1.MySQL的逻辑架构2.一条查询语句是如何执行的3.一条更新语句是如何执

导读

为了更深刻的理解 MySQL 的运行和架构组成,写下这篇博客便于以后进行复习,

你可以在这篇博客中学习到:

1.MySQL的逻辑架构

2.一条查询语句是如何执行的

3.一条更新语句是如何执行的

我想你在阅读之前带着几个疑问:

1.MySQL的架构有几个组件, 各是什么作用?

2.Server层和存储引擎层各是什么作用?

3.执行器的执行查询语句的流程是什么样的?


一:MySQL的逻辑架构

MySQL逻辑架构简单示意图:

image

MySQL在逻辑架构上包含了 Server 层和存储引擎层两大部分。



  • Server层:覆盖了MySQL的大多数核心服务,包含了连接池、查询缓存、分析器、优化器。执行器等,还有存储过程,触发器,视图等都在这一层,简单来说就是负责功能层面的事

  • 存储引擎层:负责数据的存储和提取,MySQL采用插件式的存储引擎,支持InnoDB、MyISAM、Memory等多个存储引擎,简单来说就是负责存储相关的事,

1.连接器

连接器用于用户权限验证,建立连接。从权限表里边查询用户权限并保存在一个变量里边以供查询缓存,分析器,执行器在检查权限的时候使用。



  • 如果客户端太长时间没有动静,连接器就会自动将它断开,断开时间参数 wait_timeout,默认是8小时,在连接断开之后,客户端再发生请求则会收到一个错误提醒

  • 长连接:连接成功后,如果客户端持续有请求,则一直使用同一个连接。

  • 短链接:每次执行完很少的几次查询就断开连接,下次查询再建立连接

由于连接过程始是复杂的,尽量减少连接动作,而使用长连接,但是临时使用的内存是管理在连接对象里面的,需要等到连接断开时才释放,从而导致内存占用太大,被系统强行杀掉。解决办法有两种

方法一:定期断开长连接,执行一个占用内存大的操作后,断开连接

方法二:每次执行一个比较大的操作后,执行 mysql_reset_connection 来初始化连接资源,不需要重连和重新做权限验证

2.查询缓存

用户权限通过,建立连接之后,Mysql 拿到查询请求,先去缓存中查询是否执行过这条语句,在缓存中,执行过的语句及结果,可能会以 key-value 的形式存储,如果执行过则返回结果,不需要再执行下面的步骤,极大的提高了效率。如果没有执行过,则继续执行后面的阶段,执行完成后,将结果存入缓存当中。但是大多数情况下不建议使用查询缓存,使用查询缓存往往弊大于利。因为查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空,对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非你的业务就是有一张静态表,很长时间才会更新一次。

3.分析器

缓存没有命中,则开始真正的执行语句了。Mysql 需要对 SQL语句进行解析,首先进行词法分析,主要是根据Mysql 的关键字进行验证和解析,然后做语法分析,进行表名和字段名的验证和解析。如果语句不对,则收到错误提醒。

注意:这个阶段才会打开表,知道有哪些表,进行语法分析,词法分析,检查sql语法顺序得到解析树

4.优化器

从分析器出来后,就到了优化阶段。优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。不同的执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是根据不同的方案挑选出效率最高的执行方案

5.执行器

执行器阶段,开始执行 SQL 语句,开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误。如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。这个阶段是真正执行 SQL 语句的阶段,调用 InnoDB 接口从存储引擎中获取结果集

执行器的执行流程

select * from T where ID=10;
1.调用 InnoDB 引擎接口取表的第一行,判断 ID 值是否为10,不是则跳过,是则将这行存在结果集中
2.执行引擎接口取下一行,重复执行判断逻辑,直到取到表的最后一行
3.执行器将遍历过程中所有满足条件的行组成记录集作为结果集返回给客户端

二:一条查询语句是如何执行的

上面介绍 MySQL 组件的顺序,就是一条 SQL 查询语句执行的流程,我们大致的进行梳理一下。

1.连接验证: 我们需要通过 MySQL 的客户端工具机进行数据库的连接,首先遇到的就是连接池,进行权限验证。

2.查询缓存: 当连接通过之后,Mysql 拿到查询请求,先去缓存中查询是否执行过这条语句。如果执行过则返回结果,未命中则继续下面的流程。

3.语/词法分析: 缓存未命中后,进入分析器,进行语法和语义的分析,对关键字和表名字段进行验证和解析,如果不正确则收到错误提醒。

4.执行优化: 分析器通过后进入优化阶段,优化器选择执行效率最高的方案进行执行。

5.调用接口: 执行器就会根据表的引擎定义,去使用这个引擎提供的接口,获取结果集。


三:MySQL的物理组成

我们都直到 MySQL 可以恢复到半个月内任意一秒的状态,这是怎样做到的呢?

看一下 MySQL 的物理组成简单示意图:

image

可以分为日志文件和数据文件两大部分组成。

日志文件:包含了不同类型的日志文件

数据文件:数据文件主要指不同存储引擎的物理文件

1.二进制日志-binlog

位于Server 层的日志,是MySQL的重要日志模块,以二进制额形式,将所有修改数据的 query 记录到日志文件中,包括 query 语句、执行时间、相关事务信息等。

2.redo log

是存储引擎 InnoDB 生成的日志,是InnoDB引擎特有的,主要为了保证数据的可靠性。redo log 记录了 InnoDB 所做的所有物理变更和事务信息。

两种日志的区别:

1.redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。

2.redo log 是物理日志,记录的是“在某个数据页上做了什么修改”,;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”,即SQL语句。

3.redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

4.redo log 是在事务执行过程不断的写入;binlog 是在事务最终提交前写入。

5.redo log 作为异常宕机或者介质故障后的数据恢复使用,binlog 可以应用于数据归档,主从搭建等场景。

那么为什么会有两份日志呢?

原因:在刚开始的时候,MySQL的执行引擎是MyISAM,不存在 crash-safe 的能力,只能用于数据归档,后来另一家公司Innobase Oy公司(2006年被甲骨文收购)创造了InnoDB,并且支持 crash-safe 能力,而且支持事务功能,所以再5.5之后的版本就默认使用 InnoDB 作为存储引擎

crash-safe:指数据库发生故障重启,之前提交的数据不会丢失


四:一条更新语句是如何执行的

更新语句内部执行流程:

update table_name set N=N+1 where id = 1;

1.执行器找引擎取 ID=2这一行,ID 是主键,引擎直接用树搜索找到这一行。如果这一行所在的数据页在内存当中,就直接返回给执行器,否则需要先从磁盘中读入内存,再返回

2.执行器拿到引擎给的行数据,把这个值加上 1,比如原来是 N,现在就是 N+1,得到新的一行数据,再调用引擎接口写入这行新数据

3.引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务

4.执行器生成这个操作的 binlog,并把 binlog 写入磁盘

5.执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成

最后:

想要更深入学习的朋友可以去慕课看看:http://www.imooc.com/wiki/mysqladvanced/courseintroduction.html



推荐阅读
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • tcp/ip 高清大图
    为什么80%的码农都做不了架构师?转载于:https:my.oschina.netgsbhzb ... [详细]
author-avatar
米字格时光
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有