1连接器,负责跟客户端建立连接,获取权限,维持和管理连接.
2查询缓存,
当执行查询时发现之前有这个查询语句的记录,则直接返回结果,但是,大多数情况下不建议使用缓存,因为即使花大力气存起查询的结果,在更新一个表后,会使得这个表相关的所有缓存失效,导致缓存的命中率并不高,还带来额外的开销。
3分析器,
分析器会进行词法分析和语法分析,将不符合语法的语句发会错误提醒
4 执行器
执行器在开始执行前会先判断当前用户是否有这张表的权限,然后根据MySQL所使用的引擎所提供的接口去执行语句。
2.日志系统
2.1.redo log
redo log使用的是MySQL的WAL(Write-Ahead-Logging)技术,特点是先写日志 ,再写磁盘。当有记录要更新时,先把记录写到redo log里,等系统比较空闲时再写入磁盘。InnoDB的redo log时固定大小的,从头开始写,写到末尾就又回到开头循环写,用checkpoint和write pos两个指针来指示有效记录。当数据库发生异常重启时,即使数据还没有写入磁盘,但因为redo log中保存了该记录,可以保证之前提交的记录都不会丢失,这能力称为crash-safe
2.2.binlog
redo log是引擎所使用的日志,而MySQL的Server层也有一个日志,被称为binlog。 与redo log不同,binlog只是归档日志,只记录MySQL的原始逻辑操作,例如给A表的第三行的日字段设置为C。而redo log是物理日志,记录
对某个数据页做修改。因为没有精确到某一布物理操作,binlog并不能实现crash-safe,但它也有自己的作用:binlog可以使你通过回放让MySQL系統退回之前的状态 ,因为biniog是追加写的,不会費盖以前的日志,所以你可
以退回到任意一个时刻,另外binlog 是MySQL的server 层的日志,所以无论使用什么引擎都可以使用,而redo log需要innoDb才能使用
2.3两阶段提交
Mysql 在写这两个日志的时候,会先写入Redo log 在写入Binlog然后再提交,这样能保证两个日志的一致性