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