先记住两层,而不是一串组件名

MySQL 并不是一个直接读取文件的 SQL 黑盒。Server 层负责理解请求、规划执行与协调过程;存储引擎负责数据存取。换一种存储引擎,并不意味着连接、解析和优化这些通用流程也要重写。第一讲最值得留下的是这条职责边界。

一条查询的主路径

以 SELECT name FROM products WHERE id = 42 为例,可以先用下面这条简化路径建立认知。它描述的是模块分工,不是源码函数调用顺序,也不表示每条语句都要重新建立连接。

  • 连接器:建立会话、完成身份认证,并管理连接状态。
  • 分析与预处理:识别 SQL 结构,检查语法和表、列等对象引用。
  • 优化器:在可行方案中选择访问路径,例如使用什么索引、如何安排关联顺序。
  • 执行器:按计划推进查询,通过存储引擎接口访问数据。
  • 存储引擎:完成具体的数据读取,执行过程最终把查询结果交给客户端。

连接复用,解决的是建立连接的成本

建立连接涉及网络交互、认证和会话初始化,所以连接不应在每条 SQL 后都销毁。长连接有利于复用,但长期持有的会话也可能积累资源。对应用而言,连接池除了复用连接,还需要管理连接寿命和失效状态。这是由本讲延伸出的工程检查项,并非已经做过的性能测试。

  • Sleep 表示连接当前空闲,不等于 SQL 正在执行。
  • 空闲超时和查询执行超时是不同问题;不要用同一个参数解释两种现象。
  • 资料提及的 mysql_reset_connection 是客户端 API,不是一条可以直接提交的 SQL。
  • 权限相关行为需要结合权限类型与版本判断,不把本讲的简化描述理解为所有授权变更都只在重连后生效。

查询缓存:需要标注版本的历史组件

资料中的查询缓存保存的是查询语句与结果的对应关系。表被更新后,相关缓存可能失效,因此写入频繁的业务很难持续获益。MySQL 8.0 已移除这项功能,学习现代版本时,不应把它画成查询必经的一站。这里说的是旧版 Query Cache,也不能据此推断数据库完全没有缓存。

优化器决定方案,执行器落实方案

SQL 描述想得到什么结果,执行计划决定怎么得到它。同一个关联查询,先过滤哪张表、使用哪条索引,可能影响中间结果规模。优化器负责选择方案,执行器负责调用引擎完成工作。不能只凭 SQL 写法就断言实际执行顺序,也不能把“有索引”直接等同于“访问成本低”。

把扫描与返回分开看

如果筛选列没有可用索引,执行过程可能需要读取并检查许多行,最后只返回很少的结果。反过来,走索引也不代表只访问最终返回的行。资料提醒:慢查询日志中的 rows_examined 与存储引擎内部实际扫描量不一定完全相同,分析性能时应先明确指标的统计口径。

两个容易误判的地方

  • 列不存在:本讲将其归入分析阶段;更细地说,语法正确之后还需要对象解析和语义检查,不能把它简单称为关键字拼写错误。
  • 权限校验:不能记成“只在执行器检查一次”。资料已说明优化前可能有权限预检查;缺少权限时,也可能先报告权限错误,而不是暴露表结构信息。

复习时,先回答这三个问题

  • 为什么换了存储引擎,SQL 仍然需要解析与优化?因为这部分通用能力由 Server 层承担。
  • 查询只返回一行,为什么仍然可能很慢?返回行数不代表扫描量,还要检查访问路径。
  • 在 MySQL 8.0 中找不到 query_cache_type,该往哪里排查?先确认版本差异,不要直接当作安装问题。

下一步学习

查询路径明确后,再沿着更新语句理解日志与事务。本专栏按实际学习进度追加笔记;尚未整理的课程不会预先发布为空文章。