在我们开始相识 MySQL 焦点功能之前,起首我们需要站在一个全局的视角,来看 SQL 是怎样运作执行的。通过这种方式,我们可以在头脑中构建出一幅 MySQL 各组件之间的协同工作方式,有助于我们加深对 MySQL 服务器的理解。
1、MySQL 的逻辑架构
MySQL 的架构共分为两层:Server 层和存储引擎层
Server 层:负责建立毗连、分析和执行 SQL。MySQL 大多数的焦点功能模块都在这实现,主要包括毗连池,执行器、优化器、解析器、预处置惩罚器、查询缓存等。另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等)都在 Server 层实现;
存储引擎层:负责数据的存储和提取。支持 InnoDB、MyISAM、Memory 等多个存储引擎,差别的存储引擎共用一个 Server 层。如今最常用的存储引擎是 InnoDB,从 MySQL 5.5 版本开始, InnoDB 成为了 MySQL 的默认存储引擎。我们常说的索引数据结构,就是由存储引擎层实现的。
2、SELECT 语句执行原理
2.1、毗连器
当我们通过客户端访问 MySQL 服务器前,要做的第一步就是需要先经过 TCP 三次握手,因为 MySQL 是基于 TCP 协议进行传输的
毗连的过程需要先经过 TCP 三次握手,因为 MySQL 是基于 TCP 协议进行传输的。
TCP 网络毗连建立乐成后,服务端与客户端之间会建立一个 session 会话,紧接着会对登录的用户名和密码进行效验,起首会查询自身的用户表信息,判定输入的用户名是否存在,如果存在则会判定输入的密码是否正确。密码正确后,会从毗连池中分配一条空闲线程维护当前客户端的毗连;如果没有空闲线程,则会创建一条新的工作线程。之后线程会查询用户所拥有的权限,并对其授权,后续 SQL 执行时,都会先判定是否具备相应的权限。
空闲毗连在凌驾最大空闲时长(wait_timeout)之后,毗连器会自动将它断开。
一个处于空闲状态的毗连被服务端自动断开后,客户端并不会马上知道,比及客户端在发起下一个哀求的时候,才会收到报错。
2.2、毗连池
Connection Pool,是步调启动时建驻足够的数据库毗连,并将这些毗连构成一个毗连池,由步调动态地对池中的毗连进行申请、使用、释放。主要是为了复用线程、管理线程以及限制最大毗连数。
当一个客户端实行与 MySQL 建立毗连时,MySQL 内部都会派发一条线程负责处置惩罚该客户端接下来的所有工作。
线程的频繁创建和烧毁都会耗费大量资源,通过复用线程的方式,不仅能减少开销,还能避免内存溢出等问题。
数据库毗连池可以设置最小毗连数和最大毗连数: