MySQL体系结构!

服务器处理客户端请求:

不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:

  • 客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。

img

连接管理:

每当有一个客户端进程连接到服务器进程时,服务器进程都会创建一个线程来专门处理与这个客户端的交互。

当该客户端退出时会与服务器断开连接,服务器并不会立即把与该客户端交互的线程销毁掉,而是把它缓存起来。

在另一个新的客户端再进行连接时,把这个缓存的线程分配给该新客户端。

这样就起到了不频繁创建和销毁线程的效果,从而节省开销。

MySQL服务器会为每一个连接进来的客户端分配一个线程,但是线程分配的太多了会严重影响系统性能。

  • 所以也需要限制一下可以同时连接到服务器的客户端数量。

查询缓存:

MySQL服务器会把刚刚处理过的查询请求和结果缓存起来,如果下一次有一模一样的请求过来,直接从缓存中查找结果就好了。

这个查询缓存可以在不同客户端之间共享,也就是说如果客户端A刚刚查询了一个语句。

而客户端B之后发送了同样的查询请求,那么客户端B的这次查询就可以直接使用查询缓存中的数据。

如果两个查询请求在任何字符上的不同(例如:空格、注释、大小写),都会导致缓存不会命中。

如果查询请求中包含某些系统函数、用户自定义变量和函数、一些系统表。

  • mysql 、information_schema、 performance_schema 数据库中的表,那这个请求就不会被缓存。

MySQL的缓存系统会监测涉及到的每张表,只要该表的结构或者数据被修改。

如对该表使用了INSERTUPDATEDELETETRUNCATE TABLEALTER TABLEDROP TABLEDROP DATABASE语句。

那使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除。

从MySQL 5.7.20开始,不推荐使用查询缓存,并在MySQL 8.0中删除。

存储引擎:

各种不同的存储引擎向MySQL server层提供统一的调用接口(也就是存储引擎API),包含了几十个底层函数。

MySQL server完成了查询优化后,只需按照生成的执行计划调用底层存储引擎提供的API,获取到数据后返回给客户端就好了。