上图为MySQL的简易架构图,给您有一个大概的概念,下面我将为您进行进一步的分析。

连接器:

当连接MySQL数据库时,等待的将是MySQL服务端的连接器;连接器的职责是和客户端建立连接、获取权限、维持和管理连接。客户端连接命令一般是如下所示(建议:不要在命令中显示添加登入密码):

mysql -h$ip -p$port -u$user -p$password

查询缓存:

建立完连接后,就可执行select语句。执行就会走向查询缓存。

MySQL拿到这个查询请求后,就会先到缓存中看看,之前是不是执行了该语句。在查询缓存中数据是以key-value形式存在的,key为执行的查询请求,value为查询结果。如果执行了就直接从缓存中把结果返回给客户端,请求结束。如果语句不在缓存中,就执行后续复杂操作。

在大多数情况下不建议使用查询缓存,为什么呢?因为查询缓存往往弊大于利。

查询缓存的失效非常频繁,只要对表进行了更新,该表的中查询缓存全部清除。所以往往很多时候,缓存还没使用就被清除了。对于更新压力很大的数据库来说,查询缓存的命中率很低。如果你的业务中存在一张静态表,很长时间才会更新一次。比如,系统配置表,那这张表的查询才适合查询缓存。

该功能是自动配置的。可以将参数 query_cache_type 设置成 DEMAND ,这样对于默认的SQL语句就不会使用查询缓存。而对于确定的查询语句,可以使用 SQL_CACHE 显示指定,比如如下语句:

select SQL_CACHE * from t where id = 1;

注意:在MySQL8.0之后的版本,把查询缓存模块移除了。

分析器

在没有命中查询缓存后,MySQL开始真正执行语句了。这时MySQL对该语句进行解析。

分析器首先进行词法分析,一条sql由多个字符串和空格组成,MySQL需要分析出这些字符串是什么,代表什么。

做完识别之后,进行语法分析。根据词法分析的结果,语法分析器会根据语法规则对sql语句进行分析,是否符合MySQL的语法规则。

优化器

执行完分析器后,MySQL就知道该sql语句要干什么了。在开始执行之前,要经过优化器的处理。

优化器在表里存在多个索引时,选择执行哪个索引;或者一个语句有多表关联时(join),选择各表的连接顺序。

执行器

MySQL通过分析器知道了该语句要做什么,通过优化器知道该怎么做,于是进入到了执行器阶段,开始执行语句。

开始执行之前,首先会判断用户是否有对表的执行权限(如果是在查询缓存得到结果,会在返回结果之前进行权限校验),如果没有会报错.。如果有权限,就打开表继续执行语句。打开表的时候,执行器会根据表的引擎定义,去使用引擎提供的接口。

存储引擎

MySQL区别于其他数据的最具有点的是存储引擎接口模块,MySQL可进行插拔存储引擎。

MySQL的存储引擎有很多种,比如:InnoDB、MyISAM、ISAM、Memory等。在MySQL5.6之前,默认存储引擎是MyISAM,而在该版本之后默认的是InnoDB。下表是两者之前的区别:

  InnoDB

MyISAM

存储文件

.frm 表定义文件,.ibd 数据文件和索引文件

.frm 表定义文件,.myd 数据文件, .myi 索引文件
表锁、行锁 表锁
事务 支持 不支持
CRUD 读、写 读多
count 扫表 专门存储的地方
索引结构 B+树 B+树

近期在学习MySQL数据库, 后续将会持续更新学习随笔。

MySQL之架构简单分析的更多相关文章

  1. Java高可用集群架构与微服务架构简单分析

    序 可能大部分读者都在想,为什么在这以 dubbo.spring cloud 为代表的微服务时代,我要还要整理这种已经"过时"高可用集群架构? 本人工作上大部分团队都是7-15人编 ...

  2. MySQL基础架构分析

    文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star! 搜索关注微信公众号 码出Offer 领取各种学习资料! MySQL基础架构 一.引言 我们在学习MySQL的时候,迈 ...

  3. MySQL逻辑架构概述

    1.MySQL逻辑架构 MySQL逻辑架构图 MySQL逻辑架构分四层 1.连接层:主要完成一些类似连接处理,授权认证及相关的安全方案. 2.服务层:在 MySQL据库系统处理底层数据之前的所有工作都 ...

  4. MySQL监控、性能分析——工具篇

    https://blog.csdn.net/leamonjxl/article/details/6431444 MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性 ...

  5. MySQL监控、性能分析——工具篇(转载)

    MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性能分析.监控预警.容量扩展议题越来越多.“工欲善其事,必先利其器”,那么我们如何在进行MySQL性能分析.监控预 ...

  6. MySQL之架构与历史(一)

    MySQL架构与历史 和其他数据库系统相比,MySQL有点与众不同,它的架构可以在多种不同的场景中应用并发挥好的作用,但同时也会带来一点选择上的困难.MySQL并不完美,却足够灵活,它的灵活性体现在很 ...

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

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

  8. 精通MySQL之架构篇

    老刘是即将找工作的研究生,自学大数据开发,一路走来,感慨颇深,网上大数据的资料良莠不齐,于是想写一份详细的大数据开发指南.这份指南把大数据的[基础知识][框架分析][源码理解]都用自己的话描述出来,让 ...

  9. MySQL提升笔记(1):MySQL逻辑架构

    深入学习MySQL,从概览MySQL逻辑架构开始. 首先来看一下MySQL的逻辑架构图: MySQL逻辑架构大概可以分为三层: 客户端:最上层的服务并不是MySQL所独有的,大多数基于网络的客户端/服 ...

随机推荐

  1. 【转】浅谈命令查询职责分离(CQRS)模式

    原文链接:https://www.cnblogs.com/yangecnu/p/Introduction-CQRS.html 在常用的三层架构中,通常都是通过数据访问层来修改或者查询数据,一般修改和查 ...

  2. 大话设计模式Python实现-迭代器模式

    迭代器模式(Iterator Pattern):提供方法顺序访问一个聚合对象中各元素,而又不暴露该对象的内部表示. 下面是一个迭代器模式的demo: #!/usr/bin/env python # - ...

  3. js 对象 / json / jsonb / jsonp 区别

    一.JSON vs JS 对象 1.区别 区别 Javascript 对象 Json 含义 对象的实例 一种数据格式(序列化格式) 传输 不能传输 可以跨平台传输,轻量级 格式 1.键不加引号.加单引 ...

  4. asp.net core使用serilog将日志推送到腾讯云日志服务

    为什么是serilog? Serilog是 .NET 中最著名的结构化日志类库. 基于日志事件log events,而不是日志消息log message. 你可以将日志事件格式化为控制台的可读文本或者 ...

  5. How to: Generate XPO Business Classes for Existing Data Tables 如何:为现有数据表生成 XPO 业务类

    From the Tutorial and other documentation sources, you learned how to create business classes for yo ...

  6. How to: Use XPO Upcasting in XAF 如何:在 XAF 中使用 XPO 强制转换

    In this topic, you will learn how to use the Upcasting feature of XPO in XAF. It is useful when you ...

  7. C#报Lc.exe已退出 代码为-1 错误解决方法

    解决方法一:用记事本打开*.licx,里面写的全是第三方插件的指定DLL,删除错误信息,保存,关闭,重新生成解决方案. 解决方法二:把项目文件夹下Properties文件夹下的licenses.lic ...

  8. 修改vscode的文件,对应的磁盘文件不改变

    两种解决办法: 首先:修改VSCode默认配置文件,点击左下角设置标志图 -> 设置,出来了设置相关的东西,搜索 files.autoSave 第一种:把"files.autoSave ...

  9. Harbor 清理镜像(此方法比较粗暴,但是有效)

    0x00 事件 Harbor 私有仓库中占有的存储慢慢越来越大,使用官方的清理工具以及 UI 上的垃圾清理,都似乎也不能清理掉-- 后来吾用了一种简单粗暴的方法清理镜像--删除 harbor regi ...

  10. 表单生成器(Form Builder)之伪造表单数据番外篇——指定范围随机时间

    为了伪造一些尽量真实的假数据,也真是够费劲的.上一篇笔记记录了一下获取一个随机车辆牌照,这篇笔记记录一下怎么获取一个随机时间.这篇就不说那么多废话了,直接上代码 // 获取指定范围的随机数 var g ...