相关文章 | 地址 |
---|---|
初探 InnoDB 体系架构 | 初探 InnoDB 体系架构 |
InnoDB Checkpoint与 Redo log | InnoDB Checkpoint与 Redo log |
InnoDB 存储引擎关键特性包括:
在 InnoDB 存储引擎中,主键时行唯一的标识符。通常应用程序中行记录的插入顺序按照主键递增的顺序进行插入的。因此,插入聚集索引一般是顺序的,但是不可能在每张表上只有一个聚集索引,大多数,一张表上有多个非聚集的辅助索引。这种情况下产生了一个非聚集的列不是唯一的索引。在进行插入操作时,对于非聚集索引叶子节点的插入不再是顺序的,这是需要离散式访问非聚集索引页,由于搜集读取存在而导致插入的操作性能下降。
** 对于非聚集索引插入和更新操作,不是每一次一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入;若不在,则先放入到一个 insert Buffer 对象中,然后在以一定的频率和情况进行 insert Buffer 和辅助索引叶子节点 merge 操作,通常能将多个插入合并到一个操作中,从而提高了对于非聚集索引插入的性能。
InnoDB 缓冲池确实包含了Insert Buffer的信息,但Insert Buffer 和数据页一样,也是物理存在的(以B+树的形式存在共享表空间中)。
使用 insert Buffer 的条件:
insert Buffer存在的问题,在密集写的情况加,插入缓存占用过多的缓冲池内存,默认可以最大占用1/2的缓冲池内存。
如果数据库宕机,必有大量的 insert Buffer 并没有合并到实际的非聚集索引中,因此恢复需要很长的时间
InnoDB 从1.0.x版本引入了 changge Buffer ,可将其视为 Insert Buffer 的升级,增加了对 insert、 delete、 update都进行了缓冲,change Buffer适用的对象依然是 非唯一的辅助索引
insert 对应 insert buffer
update 和 delete 对应 detete buffer 和 purge buffer 因为这里只是对索引树和索引列的维护操作,对于一个索引值没有更新操作只有删除
insert Buffer 的数据结构是一颗B+树,在 mysql 4.1之后 insert Buffer 由一颗B+数构成。负责对所有表的辅助索引进行 insert Buffer 。 这个B+树存放在共享表了空间中。
Merge insert Buffer 就是将 Insert Buffer 中的记录合并到真正的辅助索引中
在下面几种情况下发生
insert Buffer 带给 InnoDB 存储引擎时性能上的提升, 那么 doublewrite 带给 InnoDB 的时数据也的可靠性。
数据库放生宕机时,可能innoDB 存储引擎正在是写入某个页到表中,而这个页写了一部分,比如16KB的页 ,只写了前 4 KB ,之后就发生了宕机,这种情况被称为部分写失效 (partial page write)。 重做日志中记录的时对页的物理操作。如果这个页本身已经发生了损坏,在对其重做时没有意义的。
Double Write: 在应用重做日志之前,用户需要一个页得副本,当写入失效发生时,先通过页的副本来还原该页,再进行重做。
哈希查找的一般情况下的时间复杂度为 0(1),而 B+ 树的查找次数,取决于B+树的高度,在生产环境B+树的高度一般为3到4层,需要3到4此查询。
自适应哈希索引 : InnoDB 存储引擎会监控对表上各索引页的查询。如果观察到简历哈希索引可以带来速度提升,则建立哈希索引
AHI 是通过缓冲池的B+树页构造而来,因此建立的速度很快,而且不需要对整张表结构建立哈希索引。
在启用 AHI 后,读取和写入的速度可以提升2呗,辅助索引的连接操作性能可以提高5倍。
AHI 构成的条件
为了提高磁盘操作性能,当前的数据库系统都采用异步 io 的方式来处理磁盘操作。
异步IO 的优势:
刷新邻接页:当刷新一个脏页时,InnoDB 存储引擎会检测该页所在区的所有也,如果时脏页,那么一起进行刷新,通过 AIO 可以将多个IO 写入操作合并为一个 IO 操作。