参照 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.最后根据提供的接口,调用不同表对应的不同存储引擎的具体实现。