MySQL命令执行过程源码相关模块
2015-11-04 15:53
483 查看
参照 http://rrdba.cn/?p=35 画了如下的图,对MySQL sql命令的执行进行解读。
初步了解,肯定有很多错误。
1.用户在发出sql命令之后,mysql的线程管理器会建立或者重用一个线程,建立client到mysql服务器的连接。mysql会根据用户名和用户IP(或主机名),在mysql.user表中查看是否有记录,是否允许连接。
2.用户认证完成之后,会进入commander dispatcher模块(命令分发),同时会调用Logging Module记录常规日志(所以常规日志中记录的是mysql执行的所有命令,包括一些用户输入错误或者执行失败的命令,谨慎打开,在业务忙时,会增长迅速,可用于出现故障时进行故障复现时使用。)
3.在解析命令之前,会调用query cache module,根据SQL 的hash值,检查查询缓存中是否有该sql的结果集缓存。
根据SQL的hash值查找(跟oracle类似,都是用hash值)。MySQL的结果集缓存并不只能,在表中数据被修改时,无法判断与该表有关的结果集缓存是否失效,所以MySQL对于结果集缓存的处理比较粗暴,只要表中的数据被修改了,则该表在结果集中的缓存全部失效。
4.MySQL将SQL解析之后,根据SQL类型不同,调用不同的模块进行处理,如查询优化,修改,复制,统计,表的维护等模块。
5.解析并处理SQL之后,验证用户权限,是否有足够的权限执行该操作。(为什么不在用户认证阶段就进行权限验证呢?不明白)
6.最后根据提供的接口,调用不同表对应的不同存储引擎的具体实现。
初步了解,肯定有很多错误。
1.用户在发出sql命令之后,mysql的线程管理器会建立或者重用一个线程,建立client到mysql服务器的连接。mysql会根据用户名和用户IP(或主机名),在mysql.user表中查看是否有记录,是否允许连接。
2.用户认证完成之后,会进入commander dispatcher模块(命令分发),同时会调用Logging Module记录常规日志(所以常规日志中记录的是mysql执行的所有命令,包括一些用户输入错误或者执行失败的命令,谨慎打开,在业务忙时,会增长迅速,可用于出现故障时进行故障复现时使用。)
3.在解析命令之前,会调用query cache module,根据SQL 的hash值,检查查询缓存中是否有该sql的结果集缓存。
根据SQL的hash值查找(跟oracle类似,都是用hash值)。MySQL的结果集缓存并不只能,在表中数据被修改时,无法判断与该表有关的结果集缓存是否失效,所以MySQL对于结果集缓存的处理比较粗暴,只要表中的数据被修改了,则该表在结果集中的缓存全部失效。
4.MySQL将SQL解析之后,根据SQL类型不同,调用不同的模块进行处理,如查询优化,修改,复制,统计,表的维护等模块。
5.解析并处理SQL之后,验证用户权限,是否有足够的权限执行该操作。(为什么不在用户认证阶段就进行权限验证呢?不明白)
6.最后根据提供的接口,调用不同表对应的不同存储引擎的具体实现。
相关文章推荐
- mysql 批量删除带有前缀的数据库表
- 项目中常用的mysql函数
- MySQL错误代码大全
- MySQL5.7.9在win7 64下的安装配置
- 老李分享:loadrunner操作mysql数据库
- 老李分享:MySql的insert语句的性能优化方案
- MySQL添加外键
- 14.2.1 MySQL and the ACID Model
- 获取当前数据库(mysql)所有表的字段内容
- MySQL单列索引和组合索引的选择效率与explain分析
- mysql语句性能分析
- MySQL:查询语句大全
- mysql的读和写
- mysql 5.7 weindows64为 解压版按装说明
- MySQL5.6.21修改密码方法
- mySql 事务,游标以及循环
- MySQL主从复制配置详解
- Mysql触发器
- MySQL:MySQL基本入门
- MySQL事务autocommit自动提交