文档章节

InnoDB优化

枯藤KT
 枯藤KT
发布于 2015/05/29 02:29
字数 1638
阅读 13
收藏 1

原文地址

 InnoDB主索引是聚簇索引,索引与数据共用表空间,对于InnoDB而言,数据就是索引,索引就是数据。InnoDB缓存机制和MyISAM缓存机 制的最大区别就是在于,InnoDB不仅仅是缓存索引,还会是缓存数据。与MyISAM相比,InnoDB缓存可以占用更多的服务器内存缓存InnoDB 表的相关信息,提升InnoDB性能。
   1、InnoDB缓存池
      InnoDB缓存池(InnoDB  buffer pool)是InnoDB性能提升的核心,它既可以缓存数据还可以缓存索引,甚至其他管理数据(例如元数据信息,行级锁信息)。使用MySQL命 令”show variables like 'innodb%pool%';“可以查看InnoDB缓存池的相关参数信息。
    

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

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

  • InnoDB_additional_mem_pool_size:指定 InnoDB用来存储数据字典和其他内部数据结构的缓存大小,默认值是2MB。InnoDB表的个数越多,该参数的值就应该设置得越大;当InnoDB用 完缓存空间时,InnoDB就会操作系统申请内存空间,并向错误日志写入一条警告信息。

   2、InnoDB缓存池内部结构
       InnoDB在内存中维护一个缓存池用于缓存数据和索引。缓存池可以被认为一条长LRU链表,该链表又分为2个子链表,一个子链表存放old pages(里面存放的是长时间未被访问的数据页),另一个子链接存放new pages(里面存放的是最近被访问的数据页面)。old pages 默认占整个列表大小的37%(InnoDB_old_blocks_pct参数的默认值为37,取值范围是5~95),其余为new pages占用,如图下图所示。靠近LRU链表头部的数据页表示最近被访问,靠近LRU链表尾部的数据页表示长时间未被访问,而这两个部分交汇处成为 midpoint。

      当用户需要访问数据时,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链表的头部。
 
   使用MySQL命令“show variables like 'innodb_old%';可以查看InnoDB缓冲池结构的参数信息。

  • innodb_old_blocks_pct:控制old page子链表在LRU链表中的长度。

  • innodb_old_blocks_time:控制old page子链表的数据页移动到new page 子链表中的时机。

    InnoDB缓存池预热

   MySQL服务启动一段时间后,InnoDB会将经常访问的数据(包括业务数据,管理数据)置入InnoDB缓冲池中,即InnoDB缓冲池保存的是频 繁访问的数据(简称热数据)。当InnoDB缓冲池的大小是几十GB甚至是几百GB时,由于某些原因(例如数据库定期维护)重启MySQL服务,如何将之 前InnoDB缓冲池中的热数据重新加载到InnoDB缓冲池中?简单地说:如何对InnoDB缓冲池进行预热,以便于MySQL服务器快速地恢复到重启 MySQL服务之前的性能状态?
  如果单靠InnoDB自身预热InnoDB缓冲池,将会是一个不短的时间周期,业务高峰时,MySQL服务器将面临着巨大考验。在MySQL5.5以及之 前的版本中,当停止MySQL服务时,所有存储在InnoDB缓冲池中的热数据将被全部清空。从5.6版本开始,MySQL支持关闭MySQL服务时将内 存中的热数据保存到硬盘,MySQL重启后首先将硬盘中的如数据加载到InnoDB缓冲池中,以便缩短warmup进程的时间,提高业务繁忙高并发时的效 率。使用MySQL命令”show variables like ‘%innodb%pool%';''可以查看有关InnoDB缓冲池预热功能参数设置。


  • innodb_buffer_dump_at_shutdown:默认为关闭OFF。如果开启该参数,停止MySQL服务时,InnoDB将InnoDB缓冲池中的热数据保存到本地硬盘。

  • innodb_buffer_pool_load_at_startup:默认为关闭OFF。如果开启该参数,启动MySQL服务时,MySQL将本地热数据加载到InnoDB缓冲池中。

  • innodb_buffer_pool_load_now:默认为关闭OFF。如果开启该参数,停止MySQL服务时,以手动方式将InnoDB缓存池中的热数据保存到本地硬盘。

  • innodb_buffer_pool_filename:如果开启InnoDB预热功能,停止MySQL服务时,MySQL将InnoDB缓冲池中的热数据保存到数据库根目录中,默认文件名为ib_buffer_pool.

  • innodb_buffer_pool_load_aborr:默认为关闭OFF。如果开启该参数,即便开启InnoDB预热功能,启动MySQL服务室,MySQL也不会将本地硬盘的热数据加载到InnoDB缓冲池中。

    开启InnoDB缓冲池预热后,使用MySQL命令''show variables like 'Innodb_buffer%’;''可以查看InnoDB缓冲池预热的状态信息。


本文转载自:

共有 人打赏支持
枯藤KT

枯藤KT

粉丝 4
博文 99
码字总数 60947
作品 0
昌平
程序员
MySQL 8.0 首个自适应参数横空出世

|什么是自适应参数 MySQL8.0推出一个号称可以自适应服务器的参数,保证在各种不同的服务器、虚拟机、容器下自动适配服务器资源,让我们一起来看看到底它能做到什么地步。 |自适应参数是如何...

数据浮云
06/28
0
0
mysql innodb 性能优化

默认情况下,innodb的参数设置的非常小,在生产环境中远远不够用 比如最重要的两个参数 innodbbufferpoolsize 默认是8M innodbflushlogsattrxcommit 默认设置的是1 也就是同步刷新log(可以这...

daniel-john
2014/07/15
0
0
mysql的InnoDB的优化举例

硬件环境:双核单CPU,2G内存 innodbbufferpool_size=1024M-----------------InnoDB使用一个缓冲池来保存索引和原始数据,你可以设置这个变量到服务器物理内存大小的80% innodbadditionalmem...

刘理志
2010/05/20
0
0
MySQL性能优化系列-02参数调优

如果我们需要挖掘正式生产环境上MySQL数据库服务的性能潜力,那么对MySQL数据库服务中的默认参数进行更改就是必须要做的事情。 在进行配置修改之前,我们可以先看看当前MySQL数据库特别是Inn...

东皇巴顿
2017/04/29
0
0
MySQL Innodb 存储引擎参数优化

介绍: InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读。这些特色增加了多用户部署...

山哥
2011/11/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

申请Let's Encrypt永久免费SSL证书

环境安装 1、安装git yum install git-core 2、安装python 系统自带 不用安装 只要版本大于2.7即可。 获取Let's Encrypt免费SSL证书 先停止nginx 在阿里云安全组里加入 443端口的入规则 git ...

HGMrWang
30分钟前
1
0
如何使用playframework进行更好的开发

1: 自定义基类Controller 相信刚开始使用Play的人写的Controller 都继承于 play.mvc.Controller , 但这并不是一个很好的选择,自建基类Controller可以扩展更多的功能。 1.1 验证功能。 后台...

tuerqidi
35分钟前
4
0
解决ubuntu下root用户 不能ftp登陆的问题

解决ubuntu下root用户 不能ftp登陆的问题 一般情况下,由于种种原因ftp是不让root用户远程登陆,但只要你修改以个文件就可以登陆了. 注释掉 /etc/ftpusers 中的root即可 (最后重启vsftpd serv...

15834278076
46分钟前
0
0
《JavaScript高级程序设计(第3版)》阅读笔记

第6章 面向对象的程序设计 6.2 创建对象 6.2.1 工厂模式 JavaScript创建对象(一)—— 工厂模式 6.2.2 构造函数模式 JavaScript创建对象(二)——构造函数模式 6.2.3 原型模式 JavaScript...

Bob2100
51分钟前
1
0
Windows小技巧 – Win+R提高Windows使用效率

追求效率的朋友都需要一款顺手的快速启动工具,Win 平台上有键盘流的RunZ、Listary、ALTRun、Launchy、Wox 和图标流的 Fences、Rolan、 WinLaunch 等,而 Mac 上也有 Alfred、Spotlight。 而...

QQZZFT
54分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部