MySQL整个运行需要服务端与客户端的共同参与,运行着的服务器程序和客户端程序本质上都是是计算机上的一个进程,所以客户端进程向服务器进程发送请求并得到回复的过程本质上是一个进程间通信的过程。
MySQL支持下面三种通信方式:
-
使用TCP/IP协议通信;
-
命名管道和共享内存
-
Unix域套接字文件
服务器处理客户端请求
客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。
连接管理
客户端采用以上的通信方式来与服务器建立连接,每当有一个客户端进程连接到服务器进程时,服务器进程都会创建一个线程来专门处理与这个客户端的交互,当该客户端退出时会与服务器断开连接,服务器并不会立即把该客户端交互的线程销毁,而是等待新的客户端连接后再分配给它。
解析与优化
查询缓存
服务器端并不会每次都去查询,而是将查询结果缓存起来,当下一次一模一样的sql查询到来时直接返回数据。
不缓存
两个查询请求在任何字符上的不同(空格、注释、大小写)都不会命中缓存,除此之外,如果查询中包含都写系统函数、用户自定义变量和函数、一些系统表,那么请求就不会被缓存。
缓存失效
Mysql的缓存系统会监控涉及到的每张表,只要该表的结构或者数据被修改,如对该表使用了INSERT、UPDATE、DELETE等语句,那么使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除。
虽然查询缓存有时可以提升性能,但是也不得不维护缓存而造成一些开销,所以从Mysql 5.7.20开始,不推荐使用查询缓存,并在Mysql 8.0中删除。
语法解析
如果查询缓存没有命中,那么就进入正式的查询阶段,因为客户端程序发送过来的请求只是一段文本,所以Mysql服务器首先要对这段文本做分析,判断请求的语法是否正确,然后从文本中将要查询的表、各种查询条件都提取出来当道Mysql服务器内部使用的一些数据结构上来。
查询优化
语法解析之后,服务程序获得了需要的信息,比如查询的表、列、搜索条件等。除此之外,mysql还会帮我们做语句优化,如外连接转换为内连接、表达式简化、子查询转为连接等。
优化结果就是要生成一个执行计划,这个计划表明应该使用哪些索引进行查询,表之间的连接顺序。我们可以使用Explain来查看某个语句的执行计划。
存储引擎
完成查询优化之后还没有真正去访问真实的数据表,mysql服务器把数据的存储和提取操作都封装到一个叫存储引擎的模块里。
我们只知道表是一行一行记录组成的,但是这只是一个逻辑上的概念,物理上如果记录如果读取都是存储引擎负责的事情,为了实现不同的功能,mysql提供了各式各样的存储引擎,不同存储引擎管理的表具体的存储结构可能不同,采用存取算法也可能不同。
关于存储引擎的一些操作
查看当前服务器程序支持的存储引擎
设置表的存储引擎
创建表时执行存储引擎
create table 表名(
建表语句;
) ENGINE - 存储引擎名字;
修改表的存储引擎
alter table 表名 engine - 存储引擎名称;