MySQL内核InnoDB存储引擎详解(2)

特点: 
根据主键寻址速度很快 
主键值递增的insert插入效率较好 
主键值随机insert插入操作效率差

InnoDB 存储引擎体系架构

 

 

MySQL内核InnoDB存储引擎详解

缓存池: 
buffer pool缓存池是InnoDB在内存中开辟的用来缓存表数据和索引数据的区域, 一般可以设置为50%~80%的物理内存大小, 通过对经常访问的数据放置到内存当中来加快访问速度。

Buffer pool以page页的格式组成,页之间组成list列表,并通过LRU算法(最近最少使用算法) 对长久不使用的页进行置换。

数据的读写需要经过缓存(缓存在buffer pool 即在内存中)数据以整页(16K)位单位读取到缓存中缓存中的数据以LRU策略换出(最少使用策略)IO效率高,性能好

MySQL内核InnoDB存储引擎详解

MySQL内核InnoDB存储引擎详解

Adaptive Hash Index(自适应哈希索引): 
Adaptive Hash index属性使得InnoDB更像是内存数据库。该属性通过innodb_adapitve_hash_index开启,也可以通过—skip-innodb_adaptive_hash_index参数关闭 
InnoDB存储引擎会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应(adaptive) 的。自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。而且不需要将整个表都建哈希索引,InnoDB存储引擎会自动根据访问的频率和模式 来为某些页建立哈希索引。

哈希(hash)是一种非常快的等值查找方法,在一般情况下这种查找的时间复杂度为O(1),即一般仅需要一次查找就能定位数据。 
而B+树的查找次数,取决于B+树的高度,在生产环境中,B+树的高度一般3-4层,故需要3-4次的查询。 
innodb会监控对表上个索引页的查询。如果观察到建立哈希索引可以带来速度提升,则自动建立哈希索引,称之为自适应哈希索引(Adaptive Hash Index,AHI)。 
AHI有一个要求,就是对这个页的连续访问模式必须是一样的。 
例如对于(a,b)访问模式情况: 
where a = xxx 
where a = xxx and b = xxx

AHI启动后,读写速度提高了2倍,辅助索引的连接操作性能可以提高5倍。 
AHI,是数据库自动优化的,尽量使用符合AHI条件的查询,以提高效率。

Redo log buffer 
Redo log buffer是一块用来存放写入redo log文件内容的内存区域,内存的大小由innodb_log_buffer_size参数确定。该buffer的内容会定期刷新到磁盘的redo log文件中。 
参数innodb_flush_log_at_trx_commit决定了刷新到文件的方式,参数innodb_flush_log_at_timeout参数决定了刷新的频率。

系统表空间

InnoDB的系统表空间用来存放表和索引数据,同时也是doublewriter缓存,change缓存和回滚日志的存储空间,系统表空间是被多个表共享的表空间。 
默认情况下,系统表空间只有一个系统数据文件,名为ibdata1。系统数据文件的位置和个数由参数innodb_data_file_path参数决定。

 

MySQL内核InnoDB存储引擎详解

Doublewrite缓存

Doublewrite缓存是位于系统表空间的存储区域,用来缓存InnoDB的数据页从innodb buffer pool中flush之后并写入到数据文件之前,所以当操作系统或者数据库进程在数据页写磁盘的过程中崩溃,Innodb可以在doublewrite缓存中找到数据页的备份而用来执行crash恢复。 
数据页写入到doublewrite缓存的动作所需要的IO消耗要小于写入到数据文件的消耗,因为此写入操作会以一次大的连续块的方式写入。

在应用(apply)重做日志前,用户需要一个页的副本,当写入失效发生时,先通过页的副本来还原该页,再进行重做,这就是double write

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1fe1e788fe1712d1b3106819c6ce028f.html