MySQL 执行逻辑

48 阅读2分钟

说说SQL查询语句的执行逻辑?

image.png

图中描述的SQL查询的基本过程是这样的:

1)客户端发送查询SQL到服务端。

2)服务端会在查询缓存中查询是否有此SQL对应的数据,有则直接返回。

3)查询缓存没有sql对应的数据,则服务端会对sql语句进行词法分析、语法分析。

4)服务端会对SQL进行默认优化,然后生成一个执行计划。

5)服务端会将SQL执行计划交给SQL执行器。

6)SQL执行器会根据SQL执行计划,调用存储引擎执行SQL查询逻辑,并将查询结果存储到缓存。然后返回给客户端。

  • 如何查看MySQL默认支持的最大连接数?(151)
show variables like '%max_connections%';
  • 如何设置mysql支持的最大连接数?
set global max_connections=1000;

SQL语句的更新逻辑是怎样的?

  • 一条SQL更新语句的执行逻辑是怎样的,如图所示:

image.png

  1. 客户端通过TCP/IP协议与服务端建立连接。
  2. 解析SQL生成执行计划,交给执行器执行。
  3. 从磁盘加载一个记录对应的Page页(16k)到Buffer Pool。
  4. 记录undo日志(一种逻辑日志,记录的反向操作),方便回滚和MVCC(后续了解)。
  5. 更新BufferPool缓存池中Page数据,记录在Page页的更改。
  6. 将操作结果写到Redo Log Buffer(这里为物理日志,例如更新的具体数据写入buffer)。
  7. 提交事务,并将Redo Log Buffer中的更新写入到磁盘文件中,此日志主要用于做故障恢复。
  8. 将更新语句写入到binlog日志(需要开启,这里为逻辑日志),binlog日志写入磁盘,binlog主要用来备份。
  9. 写入commit标记到redo日志文件里,提交事务完成,该标记为了保证事务提交后的redo与binlog数据一致。
  10. 将Buffer Pool缓冲池中修改后的数据随机写入磁盘,以Page为单位写入,执行完后,磁盘中的name=李四;