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的内存缓存 |