数据是需要存储到磁盘上的,是以数据页(16KB)为单位存储
首先思考个问题,随机写
现在数据库表中有1000w条数据,然后我批量更新
update set xx where id in(1,34,55,89,8999)
这就会导致随机写(数据分布在磁盘中各个位置)
导致的问题就很慢,非常慢,那每次都要修改个七八百条数据,mysql还要不要活了?
怎么解决?
1.想办法给他搞成顺序写(连续的空间,不用考虑位置了)保护磁盘
2.既然慢那就想办法搞一个写内存
3.既然有内存的存在,就得考虑持久化了;因为数据基于内存会有丢失的风险,比如redis就是基于内存的框架,无论你持久化配置的再好,那也会有丢失的风险,那我们为啥没听说过mysql会有数据丢失呢?
mysql为了避免随机写造成的性能问题的优化
1.buffpool
2.WAL机制 (写日志)
3.redolog binlog二阶段提交
4undolog
sql执行语句的流程图
1.sql进来后,磁盘会以数据页为单位把数据加载到bufferpool内存中
2.写一个undolog日志
3.写redolog,然后预提交(pre commit)如果这时候宕机,根据undolog进行回滚
4.写binlog日志------如果这个时候宕机,会进行前滚,他会看redolog已经预提交了,那他会帮着进行二阶段的真正提交
5.redolog 真正的提交----如果这个时候宕机,因为还没有将数据刷到磁盘,redolog会和磁盘的数据页进行合并
6异步刷新到磁盘
7.返回成功
总体来说上面的操作都在做什么?这么麻烦还得写这么多日志,还要加载缓存
就是为了保护磁盘,防止随机写造成的性能问题
redis:为了保护数据库
bufferpool:为了保护磁盘