mysql优化系列==InnoDB引擎优化

InnoDB维护一个称为缓冲池的内存存储区域 ,用于缓存内存中的数据和索引

InnoDB缓冲池将表的索引和数据进行缓存,缓冲池允许从内存直接处理频繁使用的数据,这加快了处理速度。在专用数据库服务器上,通常将多达80%的物理内存分配给InnoDB缓冲池。因为InnoDB的存储引擎的工作方式总是将数据库文件按页读取到缓冲池,每个页16k默认(innodb_page_size=16k),在MySQL 5.7中增加了32KB和64KB页面大小的支持,之前版本是不允许大于16k的;但你只能在初始化MySQL实例之前进行配置,一旦设置了一个实例的页面大小,就不能改变它,具体看innodb_page_size参数。然后按最近最少使用(LRU)算法来保留在缓冲池中的缓存数据。如果数据库文件需要修改,总是首先修改在缓存池中的页(发生修改后,该页为脏页),然后再按照一定的频率将缓冲池的脏也刷新到文件中。所有buffer块位于同一列表,其中后3/8为old,每当新读入一个数据块时,先从队尾移除同等块数然后插入到old子列的头部,如再次访问该块则将其移至new子列的头部。


当用户需要访问数据时,InnoDB首先会在InnoDB缓冲池查找数据,如果缓冲池中没有数据时,InnoDB会将硬盘上的数据块插入到InnoDB缓存池中;如果InnoDB缓冲池已满,InnoDB通过LRU算法清楚InnoDB缓存池中个别数据块。每当有新数据块需要加载到InnoDB缓冲池中时,该数据块应变为‘‘数据页’’被插到midpoint的位置,并声明为old数据页。那么old数据页什么时候能移动到new Page链表中呢?  

(1)当InnoDB_old_blocks_time的参数值设置为0时。当old部分的数据页被访问到时,该数据页会被提升到链表的头部,并被标记为new数据页。  

(2)当InnoDB_old_blocks_time的参数值大于0时(以1000毫秒或者1秒为例)。old部分数据页插入缓冲池后,1秒之后被访问,该数据页会被提升到链表的头部,并被标记为new数据页。在刚插入到一秒内,即便old部分的数据页被访问,该数据页也不会移动到new链表的头部。

参数设置:

(1)InnoDB_buffer_pool_size:用于设置InnoDB缓存池(InnoDB_buffer_pool)的大小,默认值是47MB。InnoDB缓存池的大小对InnoDB整体性能影响较大,如果当前的MySQL服务器专门用于提供MySQL服务,应尽量增加InnoDB_buffer_pool_size的大小,把频繁访问的数据都放到内存中来,尽可能减少InnoDB对硬盘的访问,争取将InnoDB最大化成为一个内存型存储索引的访问,争取将InnoDB最大化成为一个内存存储引擎。

(2)InnoDB_buffer_pool_instances:默认值是1,表示InnoDB缓存池被划分到一个区域。适当地增加该参数(例如将该参数值设置为2),此时InnoDB被划分成为两个区域,可以提升InnoDB的并发性能。如果InnoDB缓存池被划分成多个区域,建议每个区域不小于1GB的空间。能够提供并发性能是因为每个实例都是互斥,多个实例可以提高并发能力

InnoDB缓存池预热:

MySQL服务启动一段时间后,InnoDB会将经常访问的数据(包括业务数据,管理数据)置入InnoDB缓冲池中,即InnoDB缓冲池保存的是频繁访问的数据(简称热数据)。当InnoDB缓冲池的大小是几十GB甚至是几百GB时,由于某些原因(例如数据库定期维护)重启MySQL服务,如何将之前InnoDB缓冲池中的热数据重新加载到InnoDB缓冲池中?简单地说:如何对InnoDB缓冲池进行预热,以便于MySQL服务器快速地恢复到重启MySQL服务之前的性能状态?  

从5.6版本开始,MySQL支持关闭MySQL服务时将内存中的热数据保存到硬盘,MySQL重启后首先将硬盘中的如数据加载到InnoDB缓冲池中,以便缩短warmup进程的时间,提高业务繁忙高并发时的效率。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值