蒙恩招生网 蒙恩招生网4
2023-10-30
更新时间:2023-12-03 20:50:29作者:51data
mysql的工作原理对于刚接触Mysql的朋友来说,有必要从它的工作原理入手,搞清楚这个东西的来龙去脉,为进一步的学习做铺垫。掌握它的原理有助于我们从整体上把握这个东西,有助于我们在排除故障的过程中理清思路。接下来,我们从mysql的工作原理说起。这是一个经典的图表:
Mysql内部架构
上图显示了mysql的内部架构。可以清楚的看到,Mysql是由sql接口、解析器、优化器、缓存和存储引擎组成的。
- - -
引言:1。连接器
与其他编程语言的sql语句交互,如php、java等。
2.管理服务实用程序
系统管理和控制工具
3.连接池(连接池)
管理用户连接、线程处理和其他缓存需求。
4.SQL接口(SQL接口)
接受用户的SQL命令,返回用户需要的结果查询。例如Select from,就是调用SQL接口。
5.分析器(解析器)
当SQL命令传递给解析器时,解析器将对其进行验证和解析。
主要功能:
A.将SQL语句分解成数据结构,并将这种结构传递给后续步骤,后期SQL语句的传输和处理就是基于这种结构。
B.如果在分解中遇到错误,说明这个sql语句不合理,语句不会继续执行。
6.优化器(查询优化器)
之前查询,SQL语句会被查询 optimizer优化(生成多个执行计划,最后数据库会选择优化后的计划执行,结果会尽快返回)。他使用“选择-项目-加入”策略来执行查询。
用一个例子来理解:select uid,name from性别=1的用户;
这个select查询首先根据where语句进行选择,而不是在性别筛选之前列出所有的表查询。
这个select查询先根据uid和名称进行属性投影,而不是在所有属性都取出后再进行筛选。
连接这两个查询条件,生成最终的查询结果。
7.缓存和缓冲区(查询缓存)
如果查询缓存有hit查询结果,则查询语句可以直接转到查询缓存以获取数据。
这种缓存机制由一系列小型缓存组成。如表缓存、记录缓存、键缓存、许可缓存等。
8.引擎(存储引擎)
存储引擎是MySql中处理文件的特定子系统。也是Mysql最有特色的地方。
Mysql的存储引擎是插件。它根据MySql AB提供的文件访问层的一个抽象接口定制了一个文件访问机制(这个访问机制叫做存储引擎)。
- - -
SQL语句执行过程
通常不会直接使用数据库,而是通过sql语句被其他编程语言调用mysql,由mysql处理并返回执行结果。那么Mysql收到sql语句后是如何处理的呢?
首先,程序请求将通过连接器与mysql交互。当请求无处不在时,它们将被临时存储在连接池中,并由处理器管理(管理服务实用程序)。当请求从等待队列进入处理队列时,管理器会将请求抛出到SQL接口。SQL接口收到请求后,会对请求进行哈希处理,并与缓存中的结果进行比较。如果完全匹配,会直接通过缓存返回处理结果。否则,需要一个完整的过程:
(1)由SQL接口抛给后面的解释器。如上所述,解释器会判断SQL语句是否正确,如果正确,就会转换成数据结构。
(2)解释器处理完之后,会来到优化器的后面,会生成各种各样的执行计划。最后,数据库会选择优化后的方案执行,并尽快返回结果。
(3)最优执行计划确定后,SQL语句可以由存储引擎处理,存储引擎会从后端存储设备获取相应的数据,并按原方式返回给程序。
这里有几点需要注意:
(1)如何缓存查询数据?
当存储引擎处理数据并将其返回给程序时,它还会在缓存中保留数据的副本,以便更快地处理下一个相同的请求。具体来说,mysql会对查询的语句和执行结果进行哈希处理,保存在缓存中,以备下次使用查询。
(2)2)缓冲区和缓存有什么区别?
从上图可以看出,实际上有两个缓存,buffer和cache。两者有什么区别吗?简单地说,buffer是写缓存,cache是读缓存。
(3)如何判断所需数据是否已经缓存在缓存中?
这里可能有误解。我觉得在处理SQL语句的时候,为了判断查询的结果是否已经缓存,我会贯穿整个过程。得到执行结果后,我会和要求的进行比较,看是否命中。基于此,既然不管查询的内容是否缓存在缓存中,我都要走完整个流程,那么缓存有什么好处呢?
其实并不是这样的。在第一次查询之后,mysql对语句查询和结果查询进行哈希运算并保存在缓存中。SQL查询到达后,比较两个哈希值。如果它们是相同的,它们就命中。否则就需要走完整个流程。
后面会分享更多关于DBA和devops的内容,感兴趣的朋友可以关注一下!