Mysql的读数据经历了哪些过程
ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花
Mysql读数据的核心过程可分为「客户端发起请求→连接器建立连接→解析器解析SQL→优化器制定执行计划→执行器执行查询→获取数据(缓存/存储引擎)→返回结果」7个关键步骤,每个步骤衔接紧密,确保读操作高效、准确:
1. 客户端发起读请求
客户端(如Java程序、Navicat等)通过MySQL客户端协议,向MySQL服务器发送读操作SQL(如SELECT语句),请求携带目标数据的查询条件、字段等信息。
2. 连接器建立并验证连接
MySQL服务器的连接器接收请求后,首先验证客户端的身份(用户名、密码、主机权限),验证通过后建立TCP连接,同时分配线程资源(每个连接对应一个独立线程),连接建立后保持会话状态,直至客户端主动断开或超时。
3. 解析器解析SQL(词法+语法分析)
连接器将请求传递给解析器,解析器先进行词法分析,识别SQL中的关键字(如SELECT、FROM、WHERE)、表名、字段名、查询条件等;再进行语法分析,校验SQL语法是否合法(如括号匹配、关键字顺序正确),若语法错误则直接返回错误信息,语法正确则生成抽象语法树(AST)。
4. 优化器制定最优执行计划
解析器生成的AST传递给优化器,优化器根据表的统计信息(如索引基数、数据量)、查询条件,从多种可能的执行方案中选择最优方案(如是否使用索引、使用哪个索引、表连接顺序等),最终生成执行计划(如“使用idx_name索引查询user表,过滤age>18的记录”)。
5. 执行器调用存储引擎执行查询
执行器根据优化器生成的执行计划,调用底层存储引擎(如InnoDB、MyISAM)的接口,执行具体的读操作。执行器会先判断是否有查询缓存(MySQL 8.0已移除查询缓存,5.7及以下版本会优先检查),若有缓存且未失效,则直接返回缓存结果,跳过后续存储引擎查询步骤。
6. 存储引擎读取数据(核心环节)
存储引擎接收执行器的指令后,从磁盘或内存中读取数据,核心逻辑如下:
- 优先读取缓冲池(InnoDB的buffer pool),若目标数据在缓冲池中(缓存命中),直接返回给执行器;
- 若缓存未命中,从磁盘读取数据,同时将数据加载到缓冲池(供后续读请求复用),再返回给执行器;
- 若涉及索引查询,存储引擎会先通过索引定位到数据的物理地址,再读取对应数据(避免全表扫描,提升效率)。
7. 结果处理与返回
执行器接收存储引擎返回的数据后,进行简单的结果处理(如去重、排序,若SQL中指定了DISTINCT、ORDER BY),然后将处理后的结果通过连接器、TCP连接,返回给客户端,完成一次读数据操作。
ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花
《MySQL基础专栏》专为编程新手打造!从SQL核心语法、数据增删改查,到预编译SQL、索引入门、事务基础,层层拆解MySQL必备知识点。专栏摒弃晦涩术语,以通俗讲解+实操案例,带你掌握数据库基础操作,规避SQL注入、性能低效等常见坑,快速搭建MySQL基础体系,轻松应对日常开发中的数据库基础场景。

查看3道真题和解析