innodb存储引擎有哪些好用的地方
- 读写性能高
- 故障数据恢复
- 支持事务
- mvcc多半版控制机制
以上4点是总结的innodb比较牛皮的功能,那么接下来看看innodb如何实现这些功能的?
1、读写性能高
我们知道mysql数据库是存储结构化数据的地方,99%的情况下数据都需要持久化,我们知道磁盘的读写性能很慢,那么innodb是如何保证数据既能正确持久化,又能提供高性能的读写操作呢?
答案是buffer pool。
buffer pool是innodb的缓冲池,读写操作都是通过先操作缓冲池。
读操作
一条select sql过来,会先在buffer pool里面查旋,如果缓存没有相关数据的话,会从磁盘里加在数据到缓存,然后返回结果
写操作
写操作是直接写入缓存中,然后后台线程定期将数据写入磁盘进行落盘
为什么要引入buffer pool呢?因为缓存的读写性能远远高于磁盘。通过加入缓存能够大大提高性能。但是引入buffer pool有一个问题,比如数据写入缓存中没有来得及写入磁盘,宕机了数据就会丢失。有什么办法解决呢?答案是redo log
2、故障数据恢复
redo log是怎么解决故障数据恢复的问题?其实很简单,就是每当innodb进行写操作时,记录一条redo log日志,记录一下,这条记录是怎么修改的。就相当于是一条操作日志。那么这个操作日志落不落库呢?如果落库那写磁盘很慢,如果不落库,在内存里数据又容易丢失?应该怎么衡量这两个问题?我们来看看innodb怎么实现!
innodb将redo log 先写到内存,写内存是为了提高性能,当然redo log也要落库。由于是操作日志,落库是可以采用磁盘的顺序写操作,这个性能很快。
innodb提供了几个落库的策略,通过innodb_flush_log_at_trx_commit这个配置项来控制
- innodb_flush_log_at_trx_commit = 0
事务提交redo log不刷入磁盘,等待后台线程定期刷盘。这个会出现如果来不及刷盘,msql机器宕机了数据就丢失了 - innodb_flush_log_at_trx_commit = 1
提交事务后,redo log立即刷入磁盘。这样数据是最安全。 - innodb_flush_log_at_trx_commit =2
提交事务后,redo log刷入os caceh。然后再定期刷入磁盘。这样其实还是有数据丢失的情况滴。
3、支持事务
我们知道在应用开发过程中使用数据库的大部分场景都需要支持事务。我们来看看innodb怎样来支持事务的。
innodb通过undo log来支持事务
假设要执行一个写sql操作,那么为了支持事务,innodb需要记录一条日志,记录上这个记录被修改之前的值是什么。
假如有一个student记录 id、age 、name,如果一个同学从9岁长大了一岁,那么一个update语句过来
update student set age=age+1 where id=1;
undo log会记录一条日志:这个表的age字段原来的值是 age = 9 。
然后修改buffer pool里的数据。假设事务执行失败了,则会根据undo log里面记录的原来值,来还原age=9.从而达到回滚的作用。如果事务提交了,则通过2点提到的,记录redo log,然后redo log 刷盘
4、mvcc机制
未完待续。。。