MySQL架构设计思想详解

 更新时间:2022年08月05日 09:03:59   作者:一灯架构  
这篇文章主要介绍了MySQL架构设计思想详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下

前言

很多开发同学对SQL优化如数家珍,却对MySQL架构一知半解。岂不是只见树叶,不见森林,终将陷入细节中不能自拔。

今天就一块学习MySQL分层架构,深入了解MySQL底层实现原理,以及每层的作用,我们常见的SQL优化到底在哪一层做了优化?

1. MySQL整体架构

由图中可以看到MySQL架构主要分为Server层存储引擎层

Server层又分为连接器、缓存、分析器、优化器、执行器。所有跨存储引擎的功能都在这层实现,比如:函数、存储过程、触发器、视图等。

存储引擎是可插拔式的,常见的存储引擎有MyISAM、InnoDB、Memory等,MySQL5.5之前默认的是MyISAM,之后默认的是InnoDB。

g

2. 连接器

连接器主要用来管理客户端的连接和用户身份认证。

客户端与Server端的连接采用的是TCP协议,经过TCP握手,建立连接之后,连接器开始进行身份验证。

> mysql -hlocalhost -P3306 -uroot -p

如果认证失败,就会出现错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

可以通过 show processlist 命令查看系统所有连接的信息:

其中Commond列表示连接状态,Daemon表示后台进程,Query表示查询,Sleep表示空闲连接。

3. 查询缓存

客户端请求不会直接去存储引擎查询数据,而是先在缓存中查询结果是否存在。如果结果已存在,直接返回,否则再执行一遍查询流程,查询结束后把结果再缓存起来。

如果数据表发生更改,将清空失效缓存,例如 insert、update、delete、alter操作等。

对于频繁变更的数据表来说,缓存命中率很低。使用缓存反而降低了读写性能,所以在MySQL8.0以后就移除了缓存模块。

可以通过下面命令查看是否开启了缓存:

4. 分析器

分析器主要对SQL语句进行词法分析语法分析

首先进行词法分析,分析出MySQL的关键字、以及每个词语代表的含义。然后进行语法分析,检测SQL语句是否符合MySQL语法要求。

MySQL通过识别字符串中列名、表名、where、select/update/insert 等MySQL关键字,在根据语法规则判断sql是否满足语法,最终会生成一个抽象语法树(AST)。

比如:SQL语句中少写个where关键字,就会提示错误。

mysql> select * from user id=1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=1' at line 1

5. 优化器

在真正执行SQL语句之前,还需要经过优化器处理。

我们熟知的执行计划(Explain)就是优化器生成的。

优化器主要有两个作用:逻辑优化物理优化

逻辑优化主要进行等价谓词重写、条件化简、子查询消除、连接消除、语义优化、分组合并、选择下推、索引优化查询、表查询替换视图查询、Union替换or操作等。

物理优化主要作用是通过贪婪算法,根据代价估算模型,估算出每种执行方式的代价。并使用索引优化表连接,最终生成查询执行计划。

附上MySQL优化器架构图,可以清晰的看到优化过程:

如果想知道优化器估算结果信息,可以通过Explain查看,关注一灯架构,下篇文章会详细讲解Explain具体用法。

6. 执行器

在优化器优化完SQL,并生成了执行计划后,就会把执行计划传递给执行器。

执行器调用存储引擎接口,真正的执行SQL查询。获取到存储引擎返回的查询结果,并把结果返回给客户端,至此SQL语句执行结束。

7. 总结

本篇文章主要带大家了解了MySQL分层架构,以及每层的架构的作用。可以看出MySQL每层架构分工明确、逻辑清晰,深刻地体现了架构设计中“高内聚,低耦合”的设计思想。我们平时在做架构设计的时候,也要多学习一下这种分层架构的设计思想。

到此这篇关于MySQL架构设计思想详解的文章就介绍到这了,更多相关MySQL架构设计内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入了解SQL注入

    深入了解SQL注入

    本篇文章通过SQL和MYSQL的对比,以及SQL注入的原理等方面详细分析了SQL注入相关知识点,对此有兴趣的朋友学习下。
    2018-02-02
  • MySQL表类型 存储引擎 的选择

    MySQL表类型 存储引擎 的选择

    这篇文章主要介绍了MySQL表类型存储引擎的选择,文章围绕MySQL表类型存储引擎的选择的相关资料展开内容,需要的朋友可以参考一下,希望对你有所帮助
    2021-11-11
  • Mysql查询不需要Group by的字段方法实例

    Mysql查询不需要Group by的字段方法实例

    在平时的开发任务中我们经常会用到MYSQL的GROUP BY分组,用来获取数据表中以分组字段为依据的统计数据,下面这篇文章主要给大家介绍了关于Mysql查询不需要Group by字段方法的相关资料,需要的朋友可以参考下
    2024-04-04
  • mysql中between的用法及说明

    mysql中between的用法及说明

    这篇文章主要介绍了mysql中between的用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 图文详解Mysql中如何查看Sql语句的执行时间

    图文详解Mysql中如何查看Sql语句的执行时间

    写程序的人往往需要分析所写的SQL语句是否已经优化过了,服务器的响应时间有多快,所以下面这篇文章主要给大家介绍了关于Mysql中如何查看Sql语句的执行时间的相关资料,需要的朋友可以参考下
    2021-12-12
  • Mysql中find_in_set()函数用法详解以及使用场景

    Mysql中find_in_set()函数用法详解以及使用场景

    前几天在sql查询的时候,想要判断数据库中表的某一列中的值是否在List集合中,接触到了find_in_set的使用,用起来方便快捷,下面这篇文章主要给大家介绍了关于Mysql中find_in_set()函数用法详解以及使用场景的相关资料,需要的朋友可以参考下
    2023-03-03
  • Mysql报错too many connections的原因及解决方案

    Mysql报错too many connections的原因及解决方案

    这篇文章主要给大家介绍了关于Mysql报错too many connections原因及解决方案,文中通过实例代码以及图文介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • 什么情况下需要创建MySQL索引?

    什么情况下需要创建MySQL索引?

    这篇文章主要介绍了什么情况下需要创建MySQL索引?本文同时介绍了哪些情况不适合创建MySQL索引,需要的朋友可以参考下
    2014-10-10
  • windows 10 下mysql-8.0.17-winx64的安装方法图解

    windows 10 下mysql-8.0.17-winx64的安装方法图解

    这篇文章主要介绍了windows 10 mysql-8.0.17-winx64的方法,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Mysql动态更新数据库脚本的示例讲解

    Mysql动态更新数据库脚本的示例讲解

    今天小编就为大家分享一篇关于Mysql动态更新数据库脚本的示例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12

最新评论