【MySQL 基础篇】深入解析MySQL逻辑架构与查询执行流程
1 MySQL逻辑架构概述
MySQL 的逻辑架构主要分为 Server 层和存储引擎层两部分。
- Server 层:包含连接器、查询缓存、分析器、优化器、执行器等组件。同时,所有的内置函数(如日期、时间、数学和加密函数等)也在这一层实现。此外,存储过程、触发器、视图等功能也由 Server 层来完成。
- 存储引擎层:负责数据的存储和提取,其架构模式是插件式的。常见的存储引擎有 InnoDB、MyISAM、Memory 等,从 MySQL 5.5.5 版本开始,InnoDB 成为了默认的存储引擎。
2 SQL查询语句执行流程
2.1 连接器
-
功能:负责跟客户端建立连接、获取权限、维持和管理连接。
-
连接命令:
mysql -h$ip -P$port -u$user -p
,密码若直接跟在-p
后面存在密码泄露风险。 -
权限相关:用户名和密码认证通过后,连接器会从权限表中查出用户拥有的权限。连接中的权限判断依赖于此时读取的权限,修改用户权限不会影响已存在连接的权限。
-
查看连接状态命令:
show processlist
,若结果中的 Command 列显示为“Sleep”的这一行,就表示现在系统里面有一个空闲连接。
-
连接空闲:连接空闲时间由参数
wait_timeout
控制,默认值为 8 小时。连接断开后,客户端再次发送请求会收到错误提醒。可通过show variables like "wait_timeout"
查看连接超时时间。
-
长连接:为减少建立连接的开销,建议使用长连接,但长连接可能导致内存占用过大。解决方法有定期断开长连接,或者在 MySQL 5.7 及更新版本中执行
mysql_reset_connection
来重新初始化连接资源。
2.2 查询缓存
- 执行流程:MySQL 拿到查询请求后,会先到查询缓存中查找,若能找到对应的语句,则直接返回结果;若没有命中缓存,则进入后续执行阶段,执行完成后,结果会被存入查询缓存。
- 使用建议:由于查询缓存失效频繁(只要对表进行更新,该表上所有的查询缓存都会被清空),所以大多数情况下不建议使用。可以将参数
query_cache_type
设置成DEMAND
,实现按需使用。也可以在语句中用SQL_CACHE
显式指定使用查询缓存。需要注意的是,MySQL 8.0 版本直接删除了查询缓存功能。
mysql> select SQL_CACHE * from T where ID=10;
2.3 分析器
- 词法分析:对输入的 SQL 语句进行分析,识别其中的字符串分别代表什么。
- 语法分析:根据词法分析的结果,判断 SQL 语句是否满足 MySQL 语法。如果语句存在语法错误,会收到 “
You have an error in your SQL syntax
” 的错误提醒,并提示错误位置。
2.4 优化器
在表里面有多个索引的时候,决定使用哪个索引;在一个语句有多表关联(join)时,决定各个表的连接顺序,从而确定语句的执行方案。
2.5 执行器
- 权限判断:先判断对表是否有执行查询的权限,如果没有权限,会返回没有权限的错误。
- 执行过程:有权限则打开表,根据表的引擎定义,调用引擎提供的接口。对于没有索引的表,执行器会按行遍历表中的数据,判断条件是否满足;对于有索引的表,会调用相应的接口获取数据。
- 扫描行数:执行器执行过程中会记录扫描的行数(
rows_examined
),需要注意的是,由执行器调用引擎获取数据行时累加,部分场景下引擎扫描行数跟rows_examined
并不是完全相同的。
3 课后问题解答
当表 T 中没有字段 k,执行 select * from T where k=1
语句时,会报 “Unknown column ‘k’ in ‘where clause’
” 的错误。
Answer:这个错误是在分析器阶段报出的,因为分析器的词法分析和语法分析会检查表名和字段名称是否存在等情况,当发现字段不存在时就会报错。
4 实际应用中的思考
在实际应用中,深入理解 MySQL 的架构和 SQL 查询语句的执行流程,对于优化查询性能、解决权限和语法相关问题具有重要意义。比如:
- 根据业务场景选择合适的存储引擎,判断是否使用查询缓存;
- 在开发过程中,重视分析器阶段的语法检查,减少因语法错误导致的问题;
- 合理设计索引和表结构,利用优化器提高查询效率等。
5 参考链接
- MySQL 实战 45 讲