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

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

1. MySQL整体架构

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

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

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

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底层架构设计,你了解多少?的更多相关文章

  1. 洞悉MySQL底层架构:游走在缓冲与磁盘之间

    提起MySQL,其实网上已经有一大把教程了,为什么我还要写这篇文章呢,大概是因为网上很多网站都是比较零散,而且描述不够直观,不能系统对MySQL相关知识有一个系统的学习,导致不能形成知识体系.为此我撰 ...

  2. mysql数据库架构设计与优化

    mysql数据库架构设计与优化 2019-04-23 20:51:20 无畏D尘埃 阅读数 179  收藏 更多 分类专栏: MySQL   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...

  3. 硬核剖析Java锁底层AQS源码,深入理解底层架构设计

    我们常见的并发锁ReentrantLock.CountDownLatch.Semaphore.CyclicBarrier都是基于AQS实现的,所以说不懂AQS实现原理的,就不能说了解Java锁. 上篇 ...

  4. 【大白话系列】MySQL 学习总结 之 初步了解 MySQL 的架构设计

    一.MySQL还是个黑盒子 我们都知道,只要我们系统引入了 MySQL 驱动和连接池,就能从数据库连接池获取一个数据库连接,然后就可以执行增删改查的操作了. 可是我们并不知道 MySQL 里面是怎么执 ...

  5. 打开黑盒:从 MySQL架构设计出发,看它是如何执行一条 SQL语句的

    1.把MySQL当个黑盒子一样执行SQL语句 我们的系统采用数据库连接池的方式去并发访问数据库,然后数据库自己其实也会维护一个连接池,其中管理了各种系统跟这台数据库服务器建立的所有连接 当我们的系统只 ...

  6. [数据库系列之MySQL] Mysql整体架构浅析一

    一.引言 平时我们在做Java系统时,一般情况下都会连接到一个MySQL数据库上去,执行各种增删改查的语句.大部分的Java工程师对MySQL的了解和掌握程度,大致就停留在这么一个阶段:对MySQL可 ...

  7. MySQL常见架构的应用

    MySQL 的架构设计 MySQL 架构一定要结合前台业务来设计.优化,所以不管是哪种架构.根据业务要求组合成符合需求的即是最好的.不能泛泛而谈同时.也必须注意数据的安全(如ipsec,ssh,vpn ...

  8. MySQL性能调优与架构设计-架构篇

    架构篇(1) 读书笔记 1.Scale(扩展):从数据库来看,就是让数据库能够提供更强的服务能力 ScaleOut: 是通过增加处理节点的方式来提高整体处理能力 ScaleUp: 是通过增加当前处理节 ...

  9. MySQL性能调优与架构设计

    1.Scale(扩展):从数据库来看,就是让数据库能够提供更强的服务能力 ScaleOut: 是通过增加处理节点的方式来提高整体处理能力 ScaleUp: 是通过增加当前处理节点的处理能力来提高整体的 ...

随机推荐

  1. Linux内存、Swap、Cache、Buffer详细解析

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 1. 通过free命令看Linux内存 total:总内存大小. used:已经使用的内存大小 ...

  2. Linux 运维工程师面试问答录(推荐阅读)

    一个执着于技术的公众号 本文整理了一些比较常见的 Linux 相关的面试题目,该问答录主要分为基础知识篇和服务器篇.内容主要涉及 Linux 基本原理.常用命令操作.服务器应用等部分的内容. Linu ...

  3. SpringBoot从0到0.7——第四天

    SpringBoot从0到0.7--第四天 今天进行实战开发一个小项目,SpringBoot和Thymeleaf集成的小项目 因为懒得写写前端,直接找的别人的项目在它的的基础上进行配置,进行修改.gi ...

  4. 基于dhtmlxGantt的Blazor甘特图组件

    基于dhtmlxGantt实现的甘特图组件,目前仅做到了数据展现,方法及插槽暂未实现,若需可按照dhtmlxGantt的文档及微软的Balzor文档,自行扩展. 数据发生变化后甘特图会立即发生变化. ...

  5. Packed Ciphertexts in LWE-based Homomorphic Encryption:解读

    本节内容记录阅读该论文的笔记 介绍 首先,介绍了两种明文"打包"的方法:PVW和SV PVW:对应论文(PVW:A framework for efficient and comp ...

  6. 【Java面试】简述一下你对线程池的理解?

    到底是什么面试题, 让一个工作了4年的精神小伙,只是去参加了一场技术面试, 就被搞得精神萎靡.郁郁寡欢! 这一切的背后到底是道德的沦丧,还是人性的扭曲. 让我们一起揭秘一下这道面试题. 关于, &qu ...

  7. MySQL - 数据库的隔离级别

    MySQL - 数据库的隔离级别 隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read) 未提交读(Read uncommitte ...

  8. ngx_http_fastcgi_module 的那些事

    是什么? 顾名思义,是Nginx用来处理FastCGI的模块.FastCGI是什么?这个以后再讲,可以说的是现在LNMP架构里面,PHP一般是以PHP-CGI的形式在运行,它就是一种FastCGI,我 ...

  9. Git出现“filename too long”错误处理

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年5月8日. 怎么肥事? Windows系统下,在Git使用过程中,出现"filename too long"错误提 ...

  10. JS:比较运算符

    比较运算符有如下: 1.== 等于: 值相等 var a = "0"; var b = 1; var c = 0; console.log(a==0); //true consol ...