27|InnoDB Buffer Pool 如何提高数据库性能?(上)
InnoDB Buffer Pool
- 深入了解
- 翻译
- 解释
- 总结
1. InnoDB Buffer Pool是用来缓存表空间中的数据的专门内存,通过减少磁盘访问次数来提升数据库的读写性能。 2. Buffer Pool中的缓存页和数据页的大小一致,每个缓存页都有一个对应的控制块记录缓存页的相关信息,包括页面编号、访问情况和是否被修改。 3. InnoDB Buffer Pool由1个或多个实例组成,每个实例中存在多个链表结构,包括FREE链表、LRU链表、FLUSH链表等,用于管理缓存页的加载、淘汰和刷新。 4. 引入多个Buffer Pool实例是为了减轻大内存Buffer Pool存在的资源争用,适当增加innodb_buffer_pool_instances可以提高数据库的整体性能。 5. Buffer Pool中的Hash表通过hash算法将页面映射到不同的Hash桶中,每个Hash桶内的链表节点数较少,可以快速查找缓存页。 6. Buffer Pool中还包括一些用来提升性能和保证数据一致性的结构,包括Change Buffer、自适应Hash索引、Double Write Buffer等。 7. InnoDB使用Buffer Pool主要是为了提升数据库性能,合并写入操作,以及保证事务的ACID属性。 8. 首次访问一个数据页时,要分配一个空闲的缓存页,InnoDB空闲页都链接到free链表中。随着数据库持续运行,当所有的页面都已经被使用后,需要淘汰一个现有的缓存页。 9. 首次访问数据页时,需要发起IO操作,从文件读取数据,缓存到Buffer Pool中。InnoDB使用了异步IO读取数据,大致上可以分为几个步骤。 10. 执行DML修改数据时,会先修改Buffer Pool中的缓存页,事务提交时,脏页会异步刷新到磁盘。
《MySQL 运维实战课》,新⼈⾸单¥59
全部留言(2)
- 最新
- 精选
- binzhang思考题: 对于drop的表和索引没有必要同步刷脏页和清理非脏页。mysql 可以在内存里或者文件头记录该space ID是否被drop了。可以采用异步的方式 刷脏页线程遇见drop table/index的脏页直接抛弃。新创建一个线程专门异步处理lru中的非脏页。 这样drop 超级大的表也可以很快结束。2024-10-23归属地:美国
- binzhang思考题: 关于表和索引被drop的时候要不要刷脏页回磁盘。感觉没有必要。数据库可以在内存里或文件头部记录被drop对象的space ID ,刷脏页进程 可以直接抛弃该space ID的内存页。 buffer pool中的非脏页可以设计一个新的后台进程yi2024-10-23归属地:美国