|
|
|
@ -2355,7 +2355,7 @@ mysql> show variables like 'slave_parallel%';
|
|
|
|
|
|
|
|
|
|
# 常见问题
|
|
|
|
|
|
|
|
|
|
## 问题一:MySQL事务
|
|
|
|
|
## MySQL事务
|
|
|
|
|
|
|
|
|
|
**问题一:什么Mysql的事务?事务的四大特性?事务带来的什么问题?**
|
|
|
|
|
|
|
|
|
@ -2405,43 +2405,14 @@ Mysql中事务的隔离级别分为四大等级:
|
|
|
|
|
|
|
|
|
|
**问题三:SQL查询流程是什么?**
|
|
|
|
|
|
|
|
|
|
- **1 连接**
|
|
|
|
|
当执行一条查询的SQl的时候大概发生了以下的步骤:
|
|
|
|
|
|
|
|
|
|
1.1客户端发起一条Query请求,监听客户端的‘连接管理模块’接收请求
|
|
|
|
|
|
|
|
|
|
1.2将请求转发到‘连接进/线程模块’
|
|
|
|
|
|
|
|
|
|
1.3调用‘用户模块’来进行授权检查
|
|
|
|
|
|
|
|
|
|
1.4通过检查后,‘连接进/线程模块’从‘线程连接池’中取出空闲的被缓存的连接线程和客户端请求对接,如果失败则创建一个新的连接请求
|
|
|
|
|
|
|
|
|
|
- **2 处理**
|
|
|
|
|
|
|
|
|
|
2.1先查询缓存,检查Query语句是否完全匹配,接着再检查是否具有权限,都成功则直接取数据返回
|
|
|
|
|
|
|
|
|
|
2.2上一步有失败则转交给‘命令解析器’,经过词法分析,语法分析后生成解析树
|
|
|
|
|
|
|
|
|
|
2.3接下来是预处理阶段,处理解析器无法解决的语义,检查权限等,生成新的解析树
|
|
|
|
|
|
|
|
|
|
2.4再转交给对应的模块处理
|
|
|
|
|
|
|
|
|
|
2.5如果是SELECT查询还会经由‘查询优化器’做大量的优化,生成执行计划
|
|
|
|
|
|
|
|
|
|
2.6模块收到请求后,通过‘访问控制模块’检查所连接的用户是否有访问目标表和目标字段的权限
|
|
|
|
|
|
|
|
|
|
2.7有则调用‘表管理模块’,先是查看table cache中是否存在,有则直接对应的表和获取锁,否则重新打开表文件
|
|
|
|
|
|
|
|
|
|
2.8根据表的meta数据,获取表的存储引擎类型等信息,通过接口调用对应的存储引擎处理
|
|
|
|
|
|
|
|
|
|
2.9上述过程中产生数据变化的时候,若打开日志功能,则会记录到相应二进制日志文件中
|
|
|
|
|
|
|
|
|
|
- **3 结果**
|
|
|
|
|
|
|
|
|
|
3.1Query请求完成后,将结果集返回给‘连接进/线程模块’
|
|
|
|
|
|
|
|
|
|
3.2返回的也可以是相应的状态标识,如成功或失败等
|
|
|
|
|
|
|
|
|
|
3.3‘连接进/线程模块’进行后续的清理工作,并继续等待请求或断开与客户端的连接
|
|
|
|
|
- 客户端发送查询语句给服务器
|
|
|
|
|
- 服务器首先进行用户名和密码的验证以及权限的校验
|
|
|
|
|
- 然后会检查缓存中是否存在该查询,若存在,返回缓存中存在的结果。若是不存在就进行下一步
|
|
|
|
|
- 接着进行语法和词法的分析,对SQl的解析、语法检测和预处理,再由优化器生成对应的执行计划
|
|
|
|
|
- Mysql的执行器根据优化器生成的执行计划执行,调用存储引擎的接口进行查询
|
|
|
|
|
- 服务器将查询的结果返回客户端。
|
|
|
|
|
|
|
|
|
|
SQL查询流程图如下:
|
|
|
|
|
|
|
|
|
|