跳过正文
  1. 全部/
  2. 笔记/
  3. 面试/
  4. 数据库/
  5. MySQL/

1 MySQL 执行流程

目录

Pasted image 20251124163927.png
 MySQL 的架构共分为两层:Server 层和存储引擎层

  • Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等。)都在 Server 层实现。
  • 存储引擎层负责数据的存储和提取。支持 InnoDB、MyISAM、Memory 等多个存储引擎,不同的存储引擎共用一个 Server 层。现在最常用的存储引擎是 InnoDB,InnoDB 默认索引类型是 B+树 。

第一步:连接器
#

# -h 指定 MySQL 服务得 IP 地址,如果是连接本地的 MySQL服务,可以不用这个参数;
# -u 指定用户名,管理员角色名为 root;
# -p 指定密码,如果命令行中不填写密码(为了密码安全,建议不要在命令行写密码),就需要在交互对话里面输入密码
mysql -h$ip -u$user -p
  1. 与客户端进行 TCP 三次握手建立连接;
  2. 校验客户端的用户名和密码,如果用户名或密码不对,则会报错;
  3. 如果用户名和密码都对了,会读取该用户的权限,然后后面的权限逻辑判断都基于此时读取到的权限;

第二步:查询缓存(已删除)
#

MySQL 服务收到 SQL 语句后,就会解析出 SQL 语句的第一个字段。 如果 SQL 是查询语句(select 语句),MySQL 就会先去查询缓存( Query Cache )里查找缓存数据,看看之前有没有执行过这一条命令,这个查询缓存是以 key-value 形式保存在内存中的,key 为 SQL 查询语句,value 为 SQL 语句查询的结果。

第三步:解析 SQL
#

解析器
#

第一件事情,词法分析。MySQL 会根据你输入的字符串识别出关键字出来,例如,SQL语句 select username from userinfo,在分析之后,会得到4个Token,其中有2个Keyword,分别为select和from:

关键字非关键字关键字非关键字
selectusernamefromuserinfo
第二件事情,语法分析。根据词法分析的结果,语法解析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法,如果没问题就会构建出 SQL 语法树,这样方便后面模块获取 SQL 类型、表名、字段名、 where 条件等等。
Pasted image 20251124165850.png

第四步:执行 SQL
#

每条SELECT 查询语句流程主要可以分为下面这三个阶段:

  • 预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列。
  • 优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划;
  • 执行阶段:根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端;

引擎
#

InnoDB 和 MyISAM 的核心区别主要有几点:

  1. InnoDB 支持事务,MyISAM 不支持事务,所以像电商、支付这类需要数据一致性的场景,一般都用 InnoDB。
  2. InnoDB 使用行锁,MyISAM 使用表锁。行锁并发性能更高,多人同时操作时影响更小;而 MyISAM 写操作会锁整张表,并发能力较差。
  3. InnoDB 支持 MVCC、多版本并发控制,以及崩溃恢复机制,数据安全性更好;MyISAM 宕机后容易出现表损坏。
  4. InnoDB 的主键索引是聚簇索引,数据和索引存储在一起;MyISAM 是非聚簇索引,索引和数据文件分离。
Reply by Email