发展历史
1996年,mysql 1.0发布
1996年10月,3.11.1发布
2000年ISAM升级为MyISAM存储引擎,MySQL开源
2003年,MySQL4.0发布,集成了InnoDB存储引擎
2005年,MySQL5.0发布,提供了视图、存储过程等功能
2008年,MySQK AB公司被Sun公司收购
2009年,Oracle收购了Sun公司,进入了Oracle MySQL时代
2010年,MySQL5.5发布,InnoDB成为了默认的存储引擎
2016年,Mysql发布了8.0.0版本,没有6、7版本
存储引擎
MySQL有多种存储引擎,自5.7版本依赖,InnoDB成为了默认的存储引擎,架构图如下,可以在官网查看:https://dev.mysql.com/doc/refman/5.7/en/innodb-architecture.html
以上各模块简要说明
- Buffer Pool:该模块是在内存中的,缓存的页面信息,包括数据页和缓存页,默认的大小是128M,也就是当你执行一句插入操作了,首先要修改的数据会从磁盘加载到内存,然后会在内存中buffer
poll中被修改 - change buffer:写缓存,属于buffer poll的一部分,如果这个数据页不是唯一索引,不存在重复数据的情况,也就不需要从磁盘加载索引页判断数据是不是重复,这种情况可以先把修改记录在缓冲池中,从而提升更新语句(insert、update、delete)的执行效率。change buffer默认占用buffer poll的25%
- log buffer:就是redo log buffer,是redo log在内存区域的缓冲区
- redo log:主要用于崩溃恢复,当执行修改语句时会先记录到redo log,因为记录到磁盘时如果出现异常情况可能导致数据只记录了一半,导致数据损坏,redo log就是可以在服务器重启时进行崩溃恢复
- undo log:主要是提供事务一致性的功能
server层的binlog
binlog在mysql中非常重要,binlog以事件形式记录了所有的DDL和DML语句,可以用来做数据恢复和主从复制
在开启了binlog的情况下,我们可以把binlog导出成SQL语句,把所有的操作重新执行一遍,来达到数据恢复
数据库恢复:也就是当我们的数据库损坏时,可以基于之前备份的数据库版本+binlog实现数据的恢复,所有我们的binlog必须要保存好
最后放一张修改语句在MySQL执行的大致流程,更新过程主要是修改内存和记录到日志文件,并不会直接刷新到磁盘,因为刷盘是比较影响性能的,在4到8之间,记录redo log的过程采用了二阶段提交,可以保证数据的一致性,只要第6步成功了,即使数据库崩溃了,在数据库恢复时也可以把binlog的记录更新到redo log。