InnoDB 高效保障:
1.Innodb 缓存池,不止缓存索引,也缓存数据页和其他数据。充分的利用内存读写快的特性(磁盘读写和内存读写不是一个数量级)
2.索引实现以B+ tree 形式实现。减少磁盘寻道次数(IO读取)
B+ tree 特性是:
(1) 顺序写入:减少随机I/O
(2) 二分查找:高效查找
(3) B+ tree 有很好的扇出性,对于一个亿级的数据,也只需要2-4的数据高度
这就是说,对于一个索引的查询,最多也就需要2-4次的IO查询。对于插入数据,InnoDB 提供插入缓冲的特性,可以将多次插入何必成一个IO写入磁盘
3.MVCC(多版本并发),提供了一致性非锁定读,实现高并发读。
核心原理是:
(1) 写任务发生,克隆一份数据,以版本号区分。
(2) 写任务操作新克隆的数据,直至提交。
(3) 并发任务可以继续读取旧版本数据,不至于阻塞。
4.InnoDB提供了不同程度的锁,包括 行锁,表锁,间隙锁,行锁+间隙锁的组合等。对不同的SQL操作提供不同的锁,减少不同事务对锁的竞争。
5.任何更新,都是先更新缓冲池中对应的内存页,然后再达到某种条件或者再后台定时刷新线程更新数据到磁盘。
InnoDB 安全保障:
1.二次写:提供更好的保证
为啥有了重做日志还有二次写,是为了保证即使重做日志页损坏的情况下页能恢复
2.事务:
重新日志
redo 日志,确保写入的可靠性(D 持久化的保证)
undo 日志,提供有效回滚,同时为MVCC提供前提
3.脏页的数据输入磁盘,依靠后台线程或者满足某些条件,而不是实时,以提高插入或者更新效率,将大量的随机I/O变成一次的顺序I/O
4.checkPoint 技术,提高脏页的更新效率,缩短数据库的恢复时间。
写入流程是:更新或写入请求->写入二次写缓冲区->写入共享表空间->写入重做日志缓冲->写入重做日志->刷新磁盘
注:如果关闭二次写,忽略二次写过程