1.我们启动的MySQL服务器进程的默认名是mysqld,而我们常用的MySQL客户端进程的默认名称是mysql
    2.客户端进程向服务器进程发送了一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)
    下面是一个查询请求的大致过程:

    image.png
    从图中可以看出,服务器程序处理来自客户端的查询请求大致需要经过三个部分,分别是连接管理,解析与优化、存储引擎。
    连接管理
    客户端进程通过进程间通信的方式(命名管道、共享内存、套接字编程、TCP)与服务器建立连接,每当有一个客户端进程连接到服务器进程时,服务器进程都会创建一个线程来专门与这个客户端进行交互,当该客户端退出时,会与服务器断开连接,服务器并不会立即把与该客户端交互的现成销毁,而是将其缓存起来,在另外一个新的客户端再进行连接时,实现复用(线程池的思想)
    可以减少频繁创建与销毁线程造成的开销。如果客户端和服务器段不在同一台机器啥功能,还可以采用SSL(安全套接字)的方式进行通信,保证数据传输的安全性。
    解析与优化
    解析与优化中有几个比较重要的部分:查询缓存,语法解析和查询优化

    • 查询缓存,顾名思义,一种简单的思想。这里仅说一下需要注意的几点
      • 在mysql中,如果两个查询请求在任何字符上的不同(例如空格,注释,大小写)都会导致缓存不会命中。另外,如果查询请求中包含某些系统函数、用户自定义变量和函数,一些系统表,如mysql,information_schema、performmance_schema数据库中的表,那这个请求就不会被缓存。以某些系统函数举例,可能同样的函数的两次调用会产生不一样的结果,比如函数NOW,每次调用都会产生最新的当前时间。
      • 缓存失效,Mysql的缓存系统会监测涉及到的每张表,只要该表的结构或者数据被修改,如对该表使用insert,update,delete,truncate table, alter table,drop table或drop database语句,那使用该表的所有告诉缓存查询都将变为无效并从告诉缓存中删除。
      • 虽然查询缓存有时候可以提升系统性能,但也不得不因维护这块缓存而造成一些开销,比如每次都要去查询缓存中检索,查询请求处理完需要更新查询缓存,维护该查询缓存对应的内存区域。从mysql5.7.20开始,不推荐使用查询缓存,并在mysql8.0中删除。
    • 语法解析,如果查询缓存没有命中,接下来就需要进入正式的查询阶段了,因为客户端程序发过来的请求只是一段文本而已,所以mysql服务器程序首先要对这段文本做分析,判断请求的语法是否正确,然后从文本中将要查询的表,各种查询条件都提取出来放到mysql服务器内部使用的一些数据结构上来。总结起来就是(词法解析,语法分析,语义分析)
    • 查询优化。语法解析之后,服务器程序获得了需要的信息。但光有这些还不够,MySQL的优化程序会对我们的语句做一些优化,如外连接转化为内连接,表达式简化,子查询转化连接等。优化的结果就是生成一个执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的。我们可以使用explain语句查看某个语句的执行计划。

    存储引擎
    截止到服务器程序完成了查询优化为止,还没真正的区访问真实的数据表,MySQL服务器把数据的存储和提取操作都封装到了一个叫做存储引擎的模块中。
    我们知道表是一行一行的记录组成的,但这只是逻辑上的概念,物理上如何表示记录,怎么从表中读取数据,怎么把数据写入具体的物理存储器上,这都是存储引擎负责的事情。为了实现不同的功能,MySQL提供了各种各样的存储引擎,不同存储引擎管理表具体的存储结构可能不同,采用的存取方法也可能不同。
    为了管理方便,人们把连接管理,查询缓存,语法解析,查询优化这些不涉及真是数据存储的功能划分为MySQL server模块,把真实存取数据的功能划分为存储引擎模块。常见的存储引擎总结如下:
    image.png
    最常用的就是InnoDB和MyISAM.有时会提一嘴Memory。
    我们可以使用show engines;命令来查看当前服务器程序支持的存储引擎。
    image.png
    其中support列表示该存储引擎是否可用,comment列是对存储引擎的一个描述。default代表打哪个钱服务器程序的默认存储引擎。后面未截取到的部分还有transactions列代表该存储引擎是否支持事务处理。XA列代表该存储引擎是否支持分布式事务。savepoints代表该列是否支持部分事务回滚。