innodb 的四个特性
insert buffer
innodb使用insert buffer"欺骗"数据库:对于为非惟一索引,辅助索引的修改操做并不是实时更新索引的叶子页,而是把若干对同一页面的更新缓存起来作合并为一次性更新操做,转化随机IO 为顺序IO,这样能够避免随机IO带来性能损耗,提升数据库的写性能。
1.1 原理:
a 先判断要更新的这一页在不在内存中。
b 若是不在,则读取index page 存入Insert Buffer,按照Master Thread的调度规则来合并不是惟一索引和索引页中的叶子结点.
Double write
Double write 是InnoDB在 tablespace上的128个页(2个区)是2MB;
其原理:
为了解决 partial page write 问题 ,当mysql将脏数据flush到data file的时候, 先使用memcopy 将脏数据复制到内存中的double write buffer ,以后经过double write buffer再分2次,每次写入1MB到共享表空间,而后立刻调用fsync函数,同步到磁盘上,避免缓冲带来的问题,在这个过程当中,doublewrite是顺序写,开销并不大,在完成doublewrite写入后,在将double write buffer写入各表空间文件,这时是离散写入。
若是发生了极端状况(断电),InnoDB再次启动后,发现了一个Page数据已经损坏,那么此时就能够从doublewrite buffer中进行数据恢复了。
位于共享表空间上的double write buffer实际上也是一个文件,写DWB会致使系统有更多的fsync操做, 而硬盘的fsync性能, 因此它会下降mysql的总体性能. 可是并不会下降到原来的50%. 这主要是由于:
1) double write 是一个链接的存储空间, 因此硬盘在写数据的时候是顺序写, 而不是随机写, 这样性能更高.
2) 将数据从double write buffer写到真正的segment中的时候, 系统会自动合并链接空间刷新的方式, 每次能够刷新多个pages;
自适应哈希
MySQL的Heap存储引擎默认的索引类型为哈希
而InnoDB存储引擎提出了另外一种实现方法,自适应哈希索引(adaptive hash index)。
InnoDB存储引擎会监控对表上索引的查找,若是观察到创建哈希索引能够带来速度的提高,则创建哈希索引,因此称之为自适应(adaptive)的。
自适应哈希索引经过缓冲池的B+树构造而来,所以创建的速度很快。并且不须要将整个表都建哈希索引,InnoDB存储引擎会自动根据访问的频率
限制
1.只能用于等值比较,例如=, <=>,in
2.没法用于排序
3.有冲突可能
4.Mysql自动管理,人为没法干预。
read-ahead预期
InnoDB read-ahead
InnoDB 提供了两种预读的方式,一种是 Linear read ahead,由参数innodb_read_ahead_threshold控制,当你连续读取一个 extent 的 threshold 个 page 的时候,会触发下一个 extent 64个page的预读。另一种是Random read-ahead,由参数innodb_random_read_ahead控制,当你连续读取设定的数量的page后,会触发读取这个extent的剩余page。
InnoDB 的预读功能是使用后台线程异步完成的。InnoDB启动了innodb_read_io_threads个后台线程,