MySQL查询请求的执行过程——底层原理

      最后更新:2022-07-04 22:38:48 手机定位技术交流文章

      让我们一起探索MySQL!

      • 一、连接管理
      • 二、解析与优化
        • 2.1查询缓存
        • 2.2语法解析
        • 2.3查询优化
      • 三、存储引擎

      MySQL查询请求过程

      一、连接管理

      客户端进程可以通过使用多个通信方法,例如TCP/IP、命名管道或共享内存、和UNIX域插座来建立与服务器进程的连接。当客户端进程连接到服务器进程时,服务器进程将创建一个线程,专门处理客户端的交互;当客户端退出时,与服务器的连接被切断,服务器不会立即摧毁与客户端交互的线程,而是把它缓存起来,当另一个新客户连接时,将此缓存的线程与新客户端分开。这样你不必经常创建和摧毁线程,从而节省了开销。从这个角度来看,我们可以看到,MySQL服务器将一个线程分配给每个来访客户端,但是太多的线程分配会严重影响系统性能。所以我们还需要限制可以同时连接到服务器的客户端的数量。当客户端程序启动连接时,你需要携带家庭信息、用户名、密码等,服务器程序验证客户端程序提供的信息。如果认证失败,服务器程序将拒绝连接.另外,如果客户端和服务器程序在计算机上不运行,我们还可以使用运输层安全,TLS)协议加密连接,这确保了数据传输的安全。

      当连接建立时,与客户端关联的服务器线程总是等待客户端发送的请求。 MySQL服务器接收的请求只是一个文本消息,必须以各种方式处理。

      二、解析与优化

      到目前为止,MySQL服务器已经收到了文本形式的请求,其次是“9081困难”处理,其中一些是查询缓存、语法分析和查询优化的更重要部分。

      2.1查询缓存

      如果我问你9+8*16*3*2*17的值是什么,你可以用计算器计算,或者更糟糕的是,一个简单的计算。结果为357。如果我再问你,9 + 8 * 16 - 3 * 2 * 17的值是多少,你还傻吗?我们刚算了算,直接说答案就好了。

      MySQL服务器程序同样处理查询请求,缓存刚刚处理的查询请求和结果。如果下次收到同样的请求,从缓存中直接寻找结果是很好的,你不必再看下面的表了。这个查询缓存可以与不同的客户端共享。也就是说。如果客户A刚刚发出查询请求,然后,客户端B发送了同样的查询请求,然后,客户端B的查询可以直接使用查询缓存中的数据。

      当然,MySOL服务器不够聪明,如果两个查询要求不同的字符(例如,空字段、注释、大小写),所有这些都会导致缓存不死。另外,如果查询请求包含一些系统函数,用户定义的变量和函数,系统表,myql 、 information_schema 、 performance_schema 数据库中的表,这个请求不会被缓存。以一些系统功能为例。两个对同一函数的调用可能产生不同的结果。比如函数NOW,每次调用时将生成最近的当前时间。如果此函数在两个查询请求中被调用,即使查询请求的文本信息是相同的,所以两个不同时间的查询也应该得到不同的结果。如果结果在第一个查询中被埋葬,在第二个查询中直接使用第一个查询的结果是错误的!

      不过既然是缓存,然后有一个时候,缓存失败。MySQL的缓存系统监视每个涉及的表,只要修改表的结构或数据,例如, INSERT 、 UPDATE 、 DELETE 、 TRUNCATE TABLE 、 ALTER TABLE 、 DROP TABLE 或 DROP DATABASE 语句用于此表。与此表关联的所有查询缓冲器将无效,并从查询缓冲器中删除!

      虽然查询缓冲器有时可以提高系统性能,但是,维护缓存需要花费一些费用。 例如,每次您必须在查询缓存中检索,查询请求处理后, 需要更新查询缓存.从MySQL5.7.开始,您需要维护与查询缓冲等有关的内存区域。不建议使用查询缓存,在MySQL 8.中直接从0中删除。

      2.2语法解析

      如果查询缓存未执行,下一步是进入正式查询阶段。因为客户端发送的请求只是文本,所以MySQL服务器程序首先分析了这个文本,确定请求是否正确措词,然后从文本中提取表和所有查询条件,并将其放在MySQL服务器内部使用的某些数据结构中。

      本文所提取的资料基本上是汇编过程,包括词汇分析、词汇分析、语义分析等各阶段。 这些问题不属于我们讨论的范围。

      2.3查询优化

      在语法解析之后,服务器程序得到它所需要的信息,例如,要查询的表和列是什么,搜索条件是什么,等等。但单靠这一点是不够的。因为我们写MySQL句子执行效率可能并不高,MySQL的优化程序将为我们的句子做一些优化,例如,外部连接转换为内部连接,表达式简化,子查询转换为连接等等。优化的结果是创建执行计划,该执行计划指示哪些索引应用于执行查询,以及桌子之间的联系的顺序等。我们可以使用解释来查看句子的执行计划。

      三、存储引擎

      直到服务器程序完成查询优化,在真实表中没有真正的访问数据。MySQL服务器将数据存储和提取操作包入一个叫做存储引擎的模块中。 我们知道,表由一行记录组成,但这只是一个逻辑概念。如何物理地代表一个记录,如何从表中读取数据以及如何将数据写入特定物理存储设备,全靠存储机。为了实现不同的功能,MySQL提供多种存储引擎,具有不同的存储引擎管理的表可能具有不同的存储结构,保存算法的使用可能不同。

      为什么它叫做“引擎”? 它可能是更酷的名称。 事实上,在存储引擎之前,它被称作表处理器,然后人们认为它太脏了,所以它成了存储引擎。

      MySQL支持的存储引擎:
      MySQL支持的存储引擎
      某些功能的存储引擎支持:
      存储引擎对于某些功能的支持情况

      上述内容来自MySQL如何运行-从根本上理解MySQL。

      我希望我的分享能帮助你,谢谢你!

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/29229.html

          热门文章

          文章分类