什么是MySQL
MySQL是一种关系数据库,与我们使用的大多软件一样,它由客户端和服务的组成。
MySQL的客户端/服务器架构
MySQL的服务器程序直接和我们存储的数据打交道,有很多客户端程序连接到服务器程序,发送增删改查的请求,而服务器响应请求。因此我们使用MySQL的步骤通常为:
- 启动MySQL服务器程序
- 启动MySQL客户端程序,并连接到服务器程序
客户端与服务器的连接
MySQL服务器程序和客户端程序本质属于计算机中的进程,MySQL服务器进程的默认名称为mysqld,MySQL客户端进程的默认名称为mysql。
客户端进程向服务器进程发送请求并得到回复的过程本质是一个进程间通信的过程,MySQL支持如下进程通信方式:
1)TCP/IP:MySQL服务器启动时默认申请3306端口号,默认监听此端口。
2)命名管道和共享内存。如果是Windows操作系统,则进程间可以考虑使用这两种方式进行通信。
3)Unix域套接字⽂件。若服务器进程和客户端进程都运行在类Unix的机器上,可使用该方法。
服务器处理客户端请求
服务器程序处理客户端的查询请求需要经过三个部分:连接管理、解析与优化、存储引擎。
连接管理
客户端进程可以采用上述的三种方法之一来与服务器进程建立连接,每当有⼀个客户端进程连接到服务器进 程时,服务器进程都会创建⼀个线程来专门处理与这个客户端的交互,当该客户端退出时会与服务器断开连接,服务器并不会⽴即把与该客户端交互的线程销毁 掉,⽽是把它缓存起来,在另⼀个新的客户端再进⾏连接时,把这个缓存的线程分配给该新客户端。这样就不会频繁创建和销毁线程。
客户端发起连接时,需要携带主机信息,用户名,密码。服务器程序对其进行验证。若客户端程序和服务器程序不在⼀台计算机上,可以采⽤使⽤了SSL(安全套接字)的⽹络连接进⾏通信,来保证数据传输的安全性。
解析与优化
查询缓存
服务器程序在处理查询请求时,会把处理过的查询请求和结果缓存,如果下⼀次有⼀样的请求过来,直接从缓存中查找结果。这个查询缓存可以在不同客户端之间共享。
不过,如果两个查询请求在任何字符上的不同(例如:空格,注释,大小写),会导致缓存不命中。此外,若查询请求中包含某些系统函数,用户自定义变量和函数,一些系统表(如 mysql 、information_schema、 performance_schema 数据库中的表),则该请求不会被缓存。
缓存也有失效的时候,MySQL的缓存系统会监测涉及到的每张表,只要该表的结构或者数据被修改,如对该表使⽤了INSERT等语句,则使用该表的所有高速缓存查询都会无效且从缓存中删除。
维护查询缓存会造成一定的开销,从MySQL 5.7.20开始,不推荐使⽤查询缓存,并在MySQL 8.0中删除。
语法解析
当查询缓存没有命中,则进入正式的查询阶段。客户端发送来的请求是一段文本,服务器需要对文本进行分许,判断语法是否正确,然后从文本提取出要查询的表,各种查询条件,放到服务器内部使用的一些数据结构中。
查询优化
MySQL 的优化程序会对语句做一些优化:如外连接转换为内连接。优化的结果是生成一个执行计划,该计划表明应使用哪些索引进行查询,表之间的连接顺序是怎样的。我们可以使用EXPLAIN语句来查看某个语句的查询计划。
存储引擎
截止到服务器完成查询优化为止,还没有真正的访问真实的数据表。服务器把数据的存储和提取操作都封装到存储引擎的模块中。表是由一行一行的记录组成,而物理上如何表示记录,怎样从表中读取数据,怎么把数据写入具体的物理存储器上,这些都是存储引擎负责的事情。MySQL提供了各式各样的存储引擎,不同存储引擎管理的表具体的存储结构可能不同,采⽤的存取算法也可能不同。
我们将连接管理,查询缓存,语法解析,查询优化这些不涉及真实数据存储的功能划分为MySQL服务器的功能,而真实存取数据的功能划分为存储引擎的功能。各种不同的存储引擎向上面的MySQL服务器提供同一的调用接口,包含几十个底层函数。
因此MySQL服务器在完成查询优化后&#