407 字
2 分钟
一条 MySQL 查询从连接到返回结果经历什么
客户端先建立连接并完成认证、权限检查,然后 Server 层解析 SQL,检查语法并构建语法结构;优化器根据统计信息、可用索引和代价估算选择执行计划;执行器按计划调用存储引擎接口读取记录,再进行 Server 层需要的过滤、排序、聚合等操作,最后返回结果。具体执行细节会因语句类型和版本而不同。
以 SELECT name FROM user WHERE id=7 为例,优化器可能选择主键索引查找;执行器向 InnoDB 请求记录,InnoDB 先看 Buffer Pool,必要时读页,再把行交回执行器。SQL 解析成功不等于查询高效,使用了索引也不一定代价低:选择性、回表行数、排序和统计信息都影响计划。
查询缓存已在 MySQL 8.0 移除,不能把旧版“先查 Query Cache”当作当前执行链。连接复用可减少握手成本,但长连接要管理会话状态和事务;预处理语句的缓存行为也不同于旧 Query Cache。定位性能要结合慢日志、EXPLAIN、Performance Schema 与实际负载。
追问
- 优化器在执行时才挑索引吗? 大多数计划在执行前由优化器选择;执行期也有迭代器等运行机制,但不能简单说每读一行都重新优化。
- 解析成功代表 SQL 可执行吗? 不代表,权限、对象、类型转换、约束或运行时资源都可能导致后续失败。
- MySQL 8.0 还有 Query Cache 吗? 没有,8.0 移除了 Query Cache。
一条 MySQL 查询从连接到返回结果经历什么
https://blog.xqcherry.top/posts/interview/mysql/sql-execution-process/ 目录