mysql内存体系结构_Innodb存储引擎的体系架构之内存

ec880e84c4448ffb62b30663a35bc012.png

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是索引锁在页的位置。

d6f4898add37fae78482d5a1f693068b.png

5104140d841b7c5de99ca2bb9aa6de21.png

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

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

名称自适应哈希索引适合使用场景适合使用 = 和 IN 操作符的等值查询

不合适场景不适合使用 like 和 % 的范围查询

优点提高了Innodb的内存使用率和一些情况下二级索引的查询效率

缺点占用Innodb的内存缓存

引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值