1.MySQL的分层
MySQL分为2层:Server层和存储引擎。
2.Server层
-
连接器:管理连接权限验证。
-
查询缓存:命中缓存直接返回查询结果。
-
分析器:分析语法。
-
优化器:生成执行计划,选择索引。
-
执行器:操作索引返回结果。
3.存储引擎
-
存储引擎负责数据的存储和提取,其架构是插件式的。InnoDB在MySQL5.5版本开始成为其默认存储引擎。
-
MySQL常用的存储引擎有三种:InnoDB、MyISAM、Memory。
-
InnoDB:支持事务,支持外键,是聚集索引,数据文件和索引是绑在一起的。必须要有主键,通过主键索引效率最高。但是辅助索引需要两次查询,先查询到主键,然后通过主键查询到数据,不支持全文索引。
-
MyISAM: 不支持事务,不支持外键,是非聚集索引,数据文件和索引是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的,查询效率上MyISAM要高于InnoDB,因此做读写分离的时候一般选择InnoDB做主库,MyISAM做从库。
-
Memory:文件数据保存在缓存中,有比较大的缺陷。如果Mysqld进程发生异常,重启或关机这些数据都会丢失。
-
4.SQL的执行过程
-
第一步:客户端连接上MySQL的数据库连接器,连接器获取权限维持链接,如果长时间没有使用会断开,这个时间由wait_timeout控制。
-
第二步:客户端往数据库发送sql语句,此时会检测查询缓存检查之前是否执行过这个sql,如果执行则直接返回缓存数据到客户端,当然只要更新缓存就会失效。因此更新频繁的表不建议使用查询缓存,查询缓存可以通过SQL_CACHE指定。
-
第三步:当查询未命中缓存,分析器则开始工作,分析器会判断sql语句的类型:select、insert、update,分析语法是否正确。
-
第四步:优化器将根据表的索引和sql语句决定使用什么索引和join的顺序。
-
第五步:执行器执行sql,调用存储引擎的接口,扫描遍历表或者插入更新数据。
5.MySQL日志
-
MySQL有两个重要的日志:redolog和binlog。redolog属于innodb的日志,binlog则是属于sever层的日志。
-
redolog日志:
-
redolog又称为重做日志,用于记录事务操作的变化,记录修改之前和修改之后的值,无论事务是否提交都会记录下来。
-
数据库重启恢复时会用到redolog保证数据的完整性,redolog是固定大小的,因此后面的日志会覆盖前面的日志。
-
-
binlog日志:
-
binlog又称为归档日志,它记录了数据库的所有更改操作。
-
binlog是追加形式记录日志,后面的日志不会覆盖前面的日志。
-
-
数据库更新过程
-
更新的过程:读取对应的数据到内存 --> 更新数据 --> 写入redolog日志 --> redolog状态为prepare --> 写入binlog日志 --> 提交事务 --> redolog状态为commit ,数据正式写入日志文件。
-
reolog的提交方式是“两段式提交”。
-
-
注:主要内容来自公众号《江南一点雨》