Innodb存储引擎的体系架构之内存

413 阅读3分钟

Inndo中缓冲池存在的主要目的是,减少数据库与磁盘的交互。进程通过内存读写数据的速度远远快于磁盘。

Innodb内存结构主要由两部分组成redo_log_buffer和缓冲池,redo_log_buffer作用以后在事务的持久性部分进行展开,今天主要讲缓冲池。

缓冲池

缓冲池的大小会直接影响Innodb数据库的性能,一般生产级别的mysql服务器都会将缓冲池设置为操作系统总内存的3/4,缓冲池主要由四部分组成:

  • 数据页
  • 索引页
  • change buffer
  • 自适应hash索引

数据页

数据页就是缓存真实数据的页,在innodb中数据页是主键所在聚集索引构成的B+Tree数据结构,所以这个数据页既包含索引又包含数据。

索引页

索引页就是缓存数据索引的页,这里的索引页代表的是二级索引(非聚集索引)构成的B+Tree数据结构,这个索引包含索引的数据以及数据对一个的主键id

Change Buffer

通过词义就可以知道Buffer是缓冲的意思,一般和Buffer有关的都在内存中。所以Change Buffer在缓冲池扮演的角色就是缓冲不在缓冲池数据的更新(Insert、Update、Delete)。

为什么需要Change Buffer:

如果修改的数据在缓冲池中,无论是查询和更新都不需要产生随机IO. 但是如果修改的数据不在缓冲池中,那么就需要将数据读取到缓存池中然后再进行更新,这样就会产生随机IO Change Buffer的作用就是,不在缓冲池的数据不直接读取磁盘数据,而是将修改的数据保存在Change Buffer中,Master Thread定期同步脏页,或者等到真正查询的时候再产生磁盘IO Change Buffer默认占用Innodb_buffer_pool1/4的容量,最大可以设置为1/2,通过innodb_change_buffer_max_size进行设置。

这里有几个问题:

Change Buffer如何保证持久性 Change Buffer也会将数据写入到redo log中,通过redo log保证数据的可靠性.

Change Buffer适用的索引类型 仅适用于非唯一索引,因为唯一索引需要有唯一性验证,如果需要唯一性验证就无法避免从磁盘中读取数据,所以仅适用于非唯一索引。

Change Buffer适用的场景

  • 非唯一性索引多
  • 写多读少
  • 写完就读的场景叫少的情况

自适应hash索引

Innodb本身不支持用户自己设定索引为hash索引,但是会根据条件生成自适应hash索引

因为b+tree可以有效地支持范围查询,但是hash索引遇到范围查询因为本身无序的特征就无能为力了

Innodb默认开启自适应hash索引,当数据访问次数超过总行数的1/16后添加到hash索引中

hash索引的key是索引的前缀,如字段的前缀,value是索引锁在页的位置。

通过上图可以明显看的出来,hash索引查询的层数更少一些。

通过参数innodb_adaptive_hash_index来设置参数,默认为on

名称自适应哈希索引
适合使用场景适合使用 = 和 IN 操作符的等值查询
不合适场景不适合使用 like 和 % 的范围查询
优点提高了Innodb的内存使用率和一些情况下二级索引的查询效率
缺点占用Innodb的内存缓存

引用

MySQL技术内幕(第二版)

写缓冲 (change buffer),这次彻底懂了!!!

InnoDB 到底支不支持哈希索引,为啥不同的人说的不一样?

Innodb 自适应哈希索引的优缺点