提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
众所周知,数据库是开发不能跳过的门槛,操作数据库和设计数据库的能力高低在一定程度上决定程序员的技术。数据库的学习绝不仅仅是CRUD这么简单,其底层的运行也要有所了解。目前,我也在学习数据库知识中,同时也向大家推荐我所读的书——《MySQL是怎样运行的》
MySQL存取数据总流程
不多逼逼,直接上图
这张图可以将MySQL查询数据时的过程解释的很清楚,过程总共分为三步:连接管理,解析和优化,存储引擎,具体的可以往下看
连接管理
客户端和服务端的连接
客户端和服务端是怎么连接的呢?其实运行中的服务端程序和客户端程序都是计算中的一个进程,所以客户端向服务端发送请求,服务端响应请求的过程就是进程之间的通信,那么两台计算机之间的进程通信主要就是依靠TCP/IP来完成的。
在学习网络的时候都知道,每台计算机的IP是唯一的,而计算机运行中的进程所分配到的端口号也是唯一的,所以一般实现客户端和MySQL服务端之间的连接都是使用 IP+端口号 的形式完成的,MySQL的默认端口是 3306.
连接管理的作用
之前我们已经知道客户端和服务端的连接是依靠协议来完成的,那么连接管理在MySQL运行中起到的作用是什么?
首先要知道MySQL作为程序中获取数据的重要途径,项目上线后几乎使用者都会访问数据库,那么数据库的压力就非常大,如果不减轻那么程序就会出现卡顿甚至崩溃,也有一些人就是靠频繁访问数据库的方法使得某些软件崩溃。
为了应对高压力的访问,不仅程序员做出了努力,MySQL本身也在减轻访问压力,连接管理就是其中一种方式。
每当一个客户端 A 连接到服务端时,MySQL进程就会创建一个线程来处理客户端 A 的请求;当客户端 A 关闭连接之后,服务端并不会立即销毁线程,而是将其暂时缓存,等待下一客户端 B 连接时,将缓存的这个线程给客户端 B,这就是连接管理;线程的销毁和创建是比较消耗资源的,连接管理在一定程度上减轻了访问压力。
解析和优化
查询缓存
查询缓存顾名思义就是将每次新的查询语句的结果缓存,等到下次出现一模一样的sql语句的时候,直接将缓存作为返回结果,从而减少磁盘访问次数。
这就好比在学习数学计算 22 + 12 * 10 的时候,需要经过一定的计算得出 142 的答案,那么我再次询问的 22 + 12 * 10 时,你就可以不用经过计算告诉我是 142;
但是这也是在一段时间上的记忆,缓存也是如此,是有失效的时候的。每当MySQL监测到表的结构或者表的数据出现修改时,就会将表涉及到的语句全部删除。
查询缓存的删除
凡事有利有弊,查询缓存虽然减少了文件访问次数,但是其维护的成本也不小,比如每次查询都要导缓存表中检索、每次查询完毕之后都要检车更新缓存表、系统维护缓存表的内存空间等等,随着硬件的提升,查询缓存的成本渐渐高于了磁盘访问,所以在MySQL5.7.20版本就不推荐使用查询缓存了,甚至到MySQL8.0直接删除了此模块
语法解析
语法解析其实就和Java编译一样,对请求的sql语句进行语法解析,判断该sql具体需要什么操作
查询优化
程序员所写的SQL语句执行效率上可能不高,所以MySQL会对SQL语句进一步的优化,比如说外连接转换为内连接,表达式简化,子查询转变成连接等等,尽量提升SQL语句的执行效率。
查询优化模块的出现并不意味着程序员在书写SQL语句时不考虑SQL语句执行效率的问题,程序毕竟只是程序,面对较为复杂的语句时也是优化不了的,所以程序员仍需努力。
存储引擎
到目前为止都是MySQL优化查询的操作,没有对数据库中的真实数据进行操作。数据库将存取数据的操作都封装在了一起交给存储引擎处理。不同的存储引擎管理的表可能有不同的存储结构,所以存取数据的方法也有可能不同。
MySQL服务器将处理请求分成server层和存储引擎层。不涉及到真实数据的成为server层,比如上面说的解析和优化;存储引擎为server层准备了一系列的可以调用的接口,其中包含了几十个不同用途的底层函数。
所以在server层完成了查询优化之后,只需要按照执行计划调用引擎供应的接口获取到结果返回即可。
值得注意的是,server层和存储引擎之间的交互一般是以记录为单位的,即server层按照执行计划向存储引擎读取一条记录,server层依据条件进行比较(where),如果符合就发送给客户端;反之跳过,再次向存储引擎读取下一条记录
总结
- MySQL是客户端、服务端交互的程序,客户端发送请求到服务端,服务端处理请求后响应结果给服务端
- 客户端和服务端之间的通信方式是 IP + 端口号 的形式,MySQL在Windows环境下所依靠的是 TCP/IP 协议,在 UNIX 系统(例如 Linux)环境下是依靠 UNIX 套接字域
- MySQL处理请求的过程分为三步:连接管理、解析与优化、存储引擎,其中解析与优化又分为:查询缓存(MySQL 8 已移除),语法解析,查询优化