本文使用的MySQL版本是8.0
MySQL架构
MySQL架构整体由外部程序和MySQL服务器构成。其中内部服务器分成连接层,服务层,服务管理和公共组件,存储引擎层和文件系统层。
连接层
连接层的作用是处理客户端的连接。
网络端口
一台MySQL服务器可以监听多个网络端口上的客户端连接。MySQL默认开启的是3306这个端口,可以在配置文件中修改添加多个端口。
连接管理线程
通过连接管理器线程处理端口上的客户端连接请求有以下几个场景:
- 对于所有平台:一个管理器线程就能处理所有的TCP/IP连接请求。
- 对于所有平台:可以额外开启一个端口用来管理TCP/IP连接请求。
- 对于Unix:一个管理器线程还可以处理其他的Unix Socket连接请求。
- 对于Windows:一个管理器线程处理Shared-memory方式的连接请求,另一个管理器线程处理Named-pipe方式的连接请求。
当连接管理线程收到请求后,它就会把连接请求转发到执行线程。
执行线程
一个执行线程处理一个连接请求。这里使用了池化技术来减少线程的创建与销毁。
当一个请求要处理时,先从线程池中查找是否有可用的线程:如果没有就创建一个来处理连接,当处理结束后,如果线程池没有满,就放入池中后面在用。通过下面几个系统变量和状态变量能控制连接管理线程。
- 系统变量 thread_cache_size 决定了线程池的大小。默认情况,服务器每次启动时会自动调整这个值,也可以通过选项文件来具体指定,值为0就是禁用缓存池,这样有一个连接就创建执行线程,断开连接后就释放线程。
- 系统变量 thread_stack=N 来调整线程堆栈的大小,为了应对复杂SQL的深层递归。
- 状态变量 Threads_cached 来查看线程数,Threads_created 超过线程数后创建的线程数