百度建立网站需要花多少钱,视频教学网站开发需求分析,网站建设比较好的多少钱,建立网站的市场价格虽然说 MySQL 的数据是存储在磁盘里的#xff0c;但是也不能每次都从磁盘里面读取数据#xff0c;这样性能是极差的。为此#xff0c;Innodb 存储引擎设计了一个缓冲池#xff08;Buffer Pool#xff09;#xff0c;来提高数据库的读写性能。
有了缓冲池后#xff1a; …虽然说 MySQL 的数据是存储在磁盘里的但是也不能每次都从磁盘里面读取数据这样性能是极差的。为此Innodb 存储引擎设计了一个缓冲池Buffer Pool来提高数据库的读写性能。
有了缓冲池后
当读取数据时如果数据存在于 Buffer Pool 中客户端就会直接读取 Buffer Pool 中的数据否则再去磁盘中读取。当修改数据时首先是修改 Buffer Pool 中数据所在的页然后将其页设置为脏页最后由后台线程将脏页写入到磁盘。 一、Buffer Pool 有多大
Buffer Pool 是在 MySQL 启动的时候向操作系统申请的一片连续的内存空间默认配置下 Buffer Pool 只有 128MB 。
可以通过调整 innodb_buffer_pool_size 参数来设置 Buffer Pool 的大小一般建议设置成可用物理内存的 60%~80%。 二、Buffer Pool 缓存什么
在 MySQL 启动的时候InnoDB 会为 Buffer Pool 申请一片连续的内存空间然后按照默认的16KB的大小划分出一个个的页 Buffer Pool 中的页就叫做缓存页。此时这些缓存页都是空闲的之后随着程序的运行才会有磁盘上的页被缓存到 Buffer Pool 中。
Buffer Pool 除了缓存「索引页」和「数据页」还包括了 undo 页插入缓存、自适应哈希索引、锁信息等等。 为了更好的管理这些在 Buffer Pool 中的缓存页InnoDB 为每一个缓存页都创建了一个控制块控制块信息包括「缓存页的表空间、页号、缓存页地址、链表节点」等等。
控制块也是占有内存空间的它是放在 Buffer Pool 的最前面接着才是缓存页如下图 上图中控制块和缓存页之间灰色部分称为碎片空间。 查询一条记录就只需要缓冲一条记录吗 不是的。
当我们查询一条记录时InnoDB 是会把整个页的数据加载到 Buffer Pool 中因为通过索引只能定位到磁盘中的页而不能定位到页中的一条记录。将页加载到 Buffer Pool 后再通过页里的页目录去定位到某条具体的记录。 三、如何管理 Buffer Pool
Innodb 通过三种链表来管理缓页
Free List 空闲页链表管理空闲页Flush List 脏页链表管理脏页LRU List管理脏页干净页将最近且经常查询的数据缓存在其中而不常查询的数据就淘汰出去。 InnoDB 对 LRU 做了一些优化我们熟悉的 LRU 算法通常是将最近查询的数据放到 LRU 链表的头部而 InnoDB 做 2 点优化
将 LRU 链表 分为young 和 old 两个区域加入缓冲池的页优先插入 old 区域页被访问时才进入 young 区域目的是为了解决预读失效的问题。当**「页被访问」且「 old 区域停留时间超过 innodb_old_blocks_time 阈值默认为1秒」**时才会将页插入到 young 区域否则还是插入到 old 区域目的是为了解决批量数据访问大量热数据淘汰的问题。
可以通过调整 innodb_old_blocks_pct 参数设置 young 区域和 old 区域比例。 四、脏页什么时候会被刷入磁盘
引入了 Buffer Pool 后当修改数据时首先是修改 Buffer Pool 中数据所在的页然后将其页设置为脏页但是磁盘中还是原数据。
因此脏页需要被刷入磁盘保证缓存和磁盘数据一致但是若每次修改数据都刷入磁盘则性能会很差因此一般都会在一定时机进行批量刷盘。
可能大家担心如果在脏页还没有来得及刷入到磁盘时MySQL 宕机了不就丢失数据了吗
这个不用担心InnoDB 的更新操作采用的是 Write Ahead Log 策略即先写日志再写入磁盘通过 redo log 日志让 MySQL 拥有了崩溃恢复能力。
下面几种情况会触发脏页的刷新
当 redo log 日志满了的情况下会主动触发脏页刷新到磁盘Buffer Pool 空间不足时需要将一部分数据页淘汰掉如果淘汰的是脏页需要先将脏页同步到磁盘MySQL 认为空闲时后台线程会定期将适量的脏页刷入到磁盘MySQL 正常关闭之前会把所有的脏页刷入到磁盘
在我们开启了慢 SQL 监控后如果你发现**「偶尔」会出现一些用时稍长的 SQL**这可能是因为脏页在刷新到磁盘时可能会给数据库带来性能开销导致数据库操作抖动。
如果间断出现这种现象就需要调大 Buffer Pool 空间或 redo log 日志的大小。 五、参考
小林 coding