image.png

Server 层

Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

连接器

连接器负责与客户端建立连接、获取权限并管理连接。连接命令示例:mysql -h$ip -P$port -u$user -p。连接成功后,权限判断依赖于连接时的权限设置,修改权限不影响已存在的连接。长连接适用于持续请求,但可能导致内存占用过高,建议定期断开或使用mysql_reset_connection重新初始化连接资源。

查询缓存

MySQL 接收到查询请求后,首先检查查询缓存。如果查询语句在缓存中存在,直接返回结果,效率高。但查询缓存易失效,表更新时缓存会被清空,适用于更新少的静态表。MySQL 8.0 已移除查询缓存功能。建议按需使用,设置query_cache_type为DEMAND,对特定查询使用SQL_CACHE指定缓存。

分析器

如果没有命中查询缓存,MySQL会开始执行SQL语句。首先进行词法分析,识别出关键字、表名和列名等。然后进行语法分析,检查语句是否符合MySQL语法规则。如果语法错误,会返回错误信息,并指出错误位置。

优化器

MySQL在解析SQL语句后,会通过优化器选择最佳执行计划。优化器决定使用哪个索引或表连接顺序。例如,对于多表连接查询,优化器会选择效率更高的执行方案。优化器决策后,进入执行器阶段执行SQL。关于优化器的选择机制和可能的错误,后续文章会详细解释。

执行器

MySQL在执行查询语句时,首先通过分析器和优化器确定执行计划,然后进入执行器阶段。执行器会检查用户对表的查询权限,无权限则返回错误。有权限则打开表,根据表的引擎类型调用相应接口。对于无索引的表,执行器逐行检查ID值并收集满足条件的结果集。对于有索引的表,执行逻辑类似,但调用的是“取满足条件的第一行”和“满足条件的下一行”接口。执行过程中,rows_examined字段记录了扫描的行数,但引擎扫描行数与rows_examined可能不完全相同,这将在后续文章中详细解释。

存储层

而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始成为了默认存储引擎。