InnoDB的关键特性
Inno存储引擎的关键特性包括:插入缓冲,两次写(Dubbo write)、自适应Hash索引。这些特性为InnoDB存储引擎带来了更好的性能和更高的可靠性。
1、插入缓冲
插入缓冲是InnoDB中最让人激动的特性。插入缓冲不只是缓冲池的中的一部分,InnoDB缓冲池中有Insert Buffer信息,但是Insert Buffer和数据页一样,也是物理页的一个组成部分。
主键是行唯一的标志符(一般我们用自增键来做主键),行记录的插入是按照主键递增的顺序进行插入的,因为插入聚集索引一般是顺序的,不需要磁盘的随机读取,所以如果只有一个主键索引的话插入的话是非常快的。
但是,一个表中不可能只有一个聚集索引,一张表中还有多个非聚集的辅助索引(secondary Index),非聚集索引在插入时,叶子节点的插入不再是顺序的,就需要离散的访问非聚集索引页,会影响到插入的性能。
InnoDB设计的插入缓冲,对于非聚集索引的插入或更新操作,不是每一次直接插入索引页中,而是先判断非聚集索引在是否在缓冲池中。如果在,则直接插入;如果不在,则先放入一个插入缓冲区(好似欺骗数据库这个非聚集索引已经插入到叶子节点),然后再以一定的频率执行插入缓冲和非聚集叶子节点的合并操作。这样就将多个操作合并为一个操作,大大提升了效率。
插入缓冲需要满足以下两个条件:1、索引是辅助索引 2、索引不是唯一索引(如果是唯一索引就要判断去重,造成离散读)
2、两次写
如果插入缓冲带给InnoDB存储引擎的是性能,那么两次写代给InnoDB的是可靠性。
当数据库发生宕机时,可能数据库正在写一个页面,假如页面只写了一部分,会导致数据丢失。
dubbo write 由两部分组成:一部分是内存中的dubbowrite buffer,大小为2MB;另外一部分是物品磁盘空间共享表空间中的连续的128个页,即两个区,大小同为2MB。
当缓冲池的脏页刷新时,并不直接写磁盘,而是通过memcpy函数将脏页先拷贝到内存中的Dubbo write buffer中,之后通过dubbowrite buffer再分两次,每次将1MB的写到 共享空间表的物理磁盘上,然后马上调用fsync函数,同步磁盘,避免缓冲写带来的问题。在这个过程中,dubbowrite页是连续的,所以开销不大。在完成dubbo write页的写入之后,再将dubbowrite buffer中页的写入各表空间文件中,此时的写入是离散的。
如果在写入磁盘的过程中崩溃了,在恢复过程中,InnoDB存储引擎可以从共享表空间中的dubbowrite找到该页的副本,然后将其拷贝到表空间中,再应用重做日志。
3、自适应Hash索引
hash是一种非常快速的查找方法,一般情况下复杂度为O(1)。常用于连接join操作。InnoDB提出了另外一种实现方法,自适应hash索引。
InnoDB存储引擎会监控表上对索引的查找,如果观察到简历hash索引可以带来速度的提升,就会简历hash索引,所以称之为“自适应的”。自适应Hash索引通过缓冲池的B+树构造而来,因此建立的速度非常快。而且不需要将整个表都建hash索引,InnoDB会根据访问的频率和模式来为某些页简历hash索引。
官方文档显示,自适应hash索引的功能,会提升2倍的读取和写入速度,对于辅助索引的链接操作,可以提升5倍性能,其设计思想源于数据库自动优化。
值得注意的是,hash索引的查询,只能用于搜索等值的查询。
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 24582, seg size 24584, 708160 merges
merged operations:
insert 1741884, delete mark 3568870, delete 641149
discarded operations:
insert 0, delete mark 0, delete 0
0.02 hash searches/s, 8.12 non-hash searches/s
---