服务器处理客户端请求
客户端与服务端进行通信->都是客户端向服务端发送一段文本(sql),服务器进行处理后再向客户端发送一段文本(处理结果)。那么服务端是如何对客户端发来的信息进行处理的呢?先给出一个图了解一下。
从图中可以看出,客户端向服务端发送消息分为三个部分:连接管理、解析与优化、存储引擎
连接管理
客户端与服务端的连接有三种方式;TCP/IP、Unix域套接字、管道和内存 客户端进程连接到服务端进程时,服务器进程都会创建一个线程专门来处理与这个客户端进程的交互。当客户端断开连接时,服务端并不会将线程删除,而是缓存起来,这样的操作是避免频繁的创建进程与删除进程 。不过,线程分配过多也会严重影响系统性能,可以限制客户端连接服务端的数量,这个不在这里阐述。
当连接建立后,服务端就会一直等待客户端发来的消息,对发来的文本进行一系列的处理。
解析与优化
分为三部分:查询缓存、语法解析、查询优化
查询缓存
查询缓存可以在不同的客户端之间共享,如果客户端A刚刚查询了一个语句,而客户端B随后也查询了这个相同的语句,那么服务端就会在缓存中将数据返回给客户端B。不过,查询数据的格式如果不同,哪怕是发生了一点点的变化,都会导致缓存不会被命中。例如:用户自定义的函数,某些系统函数,如now()每次的时间都不同,当然缓存就不会被命中,查询发送了变化。还有文本sql语句不一致,如大小写不同,哪怕语句是相同的,也不会被查询到。
缓存也有失效的时候。缓存会监测每一张表。当该表的结构或数据发生变化 ,缓存都会失效。如:INSERT、 DELETE、UPDATE、TRUNCATE TABLE、DROP TABLE、ALTER TABLE、DROP DATABASE。
缓存虽然能提升系统的性能,但同时也需要对其进行维护,这些需要额外的开销。从MySQL5.7开始,不推荐使用缓存,并在MySQL8.0删除
语法解析
这一步是检测文本语法是否正确,本质上就是编译过程。
查询优化
在语法解析后,服务器就获取到了需要的信息,例如要查询的是哪张表、哪些列、搜索条件。不过,我们些的MySQL语句执行起来的效率不是很高,MySQL的优化程序 会对我们的语句进行一些优化,比如外连接转为内连接···优化的结果就是生成一个优化执行计划。这个执行计划在哪里查看呢?我们可以通过EXPLAIN语句查看某个语句的执行计划。
存储引擎
截止到查询优化步骤,其实都还没有真正接触到数据库表。MySQL服务器把数据的存储和提取都封装到了存储引擎中。 物理上如何记录,读取,写入数据都是存储引擎负责的事情。
为了方便管理,可以将连接管理,查询缓存,语法解析,查询优化这些并不真正涉及真实数据存储的功能划分为MySQL server 的功能,而将真实数据存储的功能划分为存储引擎的功能。各种不同的存储引擎都可以向上边MySQL server提供一个封装好的接口(存储引擎API)。
所以MySQL server完成了查询优化后,只需要按照优化的执行计划调用存储引擎提供的API就可以将获取到的数据返回给客户端。