InnoDB内存优化

1.InnoDB缓存机制

InnoDB用一块内存区做IO缓存池,该缓存池不仅用来缓存InnoDB的索引块,而且也用来缓存InnoDB的数据块,这一点与MyISAM不同。

在内部,InnoDB缓存池逻辑上由 free list、flush list和LRU list组成。顾名思义,free list是空闲缓存块列表,flush list是需要刷新到磁盘的缓存块列表,而LRU list是 InnoDB正在使用的缓存块,它是 InnoDB buffer pool的核心。

InnoDB使用的LRU算法与MyISAM的“中点插入策略”LRU算法很类似,大致原理是:将LRU list分为 young sublist和 old sublist,数据从磁盘读入时,会将该缓存块插入到LRU list的“中点”,即 old sublist的头部;经过一定时间的访问(由innodb_old_blocks_time系统参数决定),该数据块将会由 old sublist转移到young sublist的头部,也就是整个LRU list的头部;随着时间的推移,young sublist和 old sublist中较少被访问的缓存块将从各自链表的头部逐渐向尾部移动;需要淘汰数据块时,优先从链表尾部淘汰。这种设计同样是为了防止偶尔被访问的索引块将访问频繁的热块淘汰。

2.innodb_buffer_pool_size的设置

innodb_buffer_pool_size 决定 InnoDB 存储引擎表数据和索引数据的最大缓存区大小。在保证操作系统及其他程序有足够内存可用的情况下,innodb_buffer_pool_size的值越大,缓存命中率越高,访问InnoDB表需要的磁盘I/O就越少,性能也就越高。在一个专用的数据库服务器上,可以将 80%的物理内存分配给 InnoDB buffer pool,但一定要注意避免设置过大而导致页交换。

innodb_buffer_pool_size=2G

通过以下命令查看 buffer pool的使用情况:

mysqladmin -S /tmp/mysql.sock ext|grep -i innodb_buffer_pool

可用以下公式计算InnoDB缓存池的命中率:

(1-innodb_buffer_pool_read/innodb_buffer_pool_read_request)*100

如果命中率太低,则应考虑扩充内存、增加innodb_buffer_pool_size的值。

3.调整old sublist大小

在LRU list中,old sublist的比例由系统参数 innodb_old_blocks_pct决定,其取值范围是5~95,默认值是37(约等于3/8)。通过以下命令可以查看其当前设置:

mysql> show global variables like '%innodb_old_blocks_pct%';

可以根据 InnoDB Monitor的输出信息来调整 innodb_old_blocks_pct的值。例如,在没有较大表扫描或索引扫描的情况下,如果 young/s 的值很低,可能就需要适当增大innodb_old_blocks_pct的值或减小innodb_old_blocks_time的值。

4.调整innodb_old_blocks_time的设置

可以根据 InnoDB Monitor的输出信息来调整 innodb_old_blocks_time的值。在进行表扫描时,如果non-youngs/s很低,young/s很高,就应考虑将innodb_old_blocks_time适当调大,以防止表扫描将真正的热数据淘汰。更酷的是,这个值可以动态设置,如果要进行大的表扫描操作,可以很方便地临时做调整。

5.调整缓存池数量,减少内部对缓存池数据结构的争用

InnoDB的缓存系统引入了innodb_buffer_pool_instances配置参数,对于较大的缓存池,适当增大此参数的值,可以降低并发导致的内部缓存访问冲突,改善性能。

6.控制 innodb buffer刷新,延长数据缓存时间,减缓磁盘 I/O

在InnoDB找不到干净的可用缓存页或检查点被触发等情况下,InnoDB的后台线程就会开始把“脏的缓存页”回写到磁盘文件中,这个过程叫缓存刷新。

InnoDB buffer pool的刷新快慢主要取决于两个参数。一个是innodb_max_dirty_pages_pct,它控制缓存池中脏页的最大比例,默认值是75%,如果脏页的数量达到或超过该值,InnoDB的后台线程将开始缓存刷新。另一个是innodb_io_capacity,它代表磁盘系统的IO能力,其值在一定程度上代表磁盘每秒可完成 I/O 的次数。innodb_io_capacity 的默认值是 200,对于转速较低的磁盘,如7200RPM的磁盘,可将innodb_io_capacity的值降低到100,而对于固态硬盘和由多个磁盘组成的盘阵,innodb_io_capacity的值可以适当增大。

可以根据一些InnoDB Monitor的值来调整innodb_max_dirty_pages_pct和innodb_io_capacity。例如,若innodb_buffer_pool_wait_free的值增长较快,则说明InnoDB经常在等待空闲缓存页,如果无法增大缓存池,那么应将innodb_max_dirty_pages_pct的值调小,或将innodb_io_capacity的值提高,以加快脏页的刷新。

7.InnoDB doublewrite

默认情况下,InnoDB doublewrite是开启的,可以用以下命令查看:

mysql> show global variables like '%doublewrite%';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

问题 L: 超超的中等意思

问题 L: 超超的中等意思 时间限制: 1 Sec 内存限制: 128 MB提交: 366 解决: 27[提交] [状态] [命题人:jsu_admin]题目描述 已知p,q,k和一个难搞得多项式(pxqy)^k。想知道在给定a和b的值下计算多项式展开后x^a*y^b得系数s。输入 多组输入,每组数据一行输入p,q,k,a,…

改善带有 order by子句或group子句SQL的性能

如果通过 show global status 看到 sort_merge_passes 的值很大,可以考虑通过调整参数sort_buffer_size的值来增大排序缓存区,以改善带有 order by子句或group子句SQL的性能。 对于无法通过索引进行连接操作的查询,可以尝试通过增大&#xf…

springboot系列十五、springboot集成PageHelper

一、介绍 项目中经常会遇到分页,PageHelper为我们解决了这个问题。本质上实现了Mybatis的拦截器,作了分页处理。 二、配置PageHelper 1、引入依赖 pagehelper-spring-boot-starter对了pagehelper做了封装,减少 了配置文件,只需要在…

SELinux 引起的 Docker 启动失败

问题描述 Linux OS 版本 CentOS Linux release 7.2.1511 (Core) 启动Docker service docker start 启动失败信息 原因分析 Error starting daemon: SELinux is not supported with the overlay2 graph driver on this kernel. Either boot into a newer kernel or disabl...nab…

第十一章 Helm-kubernetes的包管理器(上)

Helm - K8s的包管理器 11.1 Why Helm K8s能够很好的组织和编排容器,但它缺少一个更高层次的应用打包工具,Helm就是干这个的。 比如对于一个MySQL服务,K8s需要部署如下对象: (1)Service,让外界能…

C# - JSON详解

C# - JSON详解 转载于:https://www.cnblogs.com/macT/p/10214396.html

弗尤博客(十一)之搜索博文

在首页中右侧在textbox输入值,单击搜索Botton 跳转到 找一找 页面 其中textbox文本值传递过去并且显示在控件中,搜索结果也一起显示(datalist)转载于:https://www.cnblogs.com/frankybpx/p/10214409.html

史上最全的前端开发面试题(含详细答案)

本文由我收集网络 自己平时面试的 或者面试别人时的一些前端面试题,初学者阅后也要用心钻研其中的原理,重要知识需要系统学习、透彻学习,形成自己的知识链。万不可投机取巧,切勿临时抱佛脚只求面试侥幸混过关. 知识最重要的是学习…

MySQL之IFNULL()、ISNULL、NULLIF用法

MySQL之IFNULL()、ISNULL、NULLIF用法 IFNULL语法说明 IFNULL(expr1,expr2) 如果 expr1 不是 NULL,IFNULL() 返回 expr1,否则它返回 expr2。 IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。 举个栗子: 1 mysql…

postgresql模糊匹配正则表达式性能问题

postgresql 模糊匹配 目前建议使用like,~~,不建议使用正则表达式, 目前有性能问题https://yq.aliyun.com/articles/405097正则表达式效率比较低下:操作符 ~~ 等效于 LIKE, 而 ~~* 对应 ILIKE。 还有 !~~ 和 !~~* 操作符 分别代表 …

数据库的原理,一篇文章搞定(一)

https://blog.csdn.net/zhangcanyan/article/details/51439012 一提到关系型数据库,我禁不住想:有些东西被忽视了。关系型数据库无处不在,而且种类繁多,从小巧实用的 SQLite 到强大的 Teradata 。但很少有文章讲解数据库是如何工作…

配置MySQL的环境变量

配置MySQL的环境变量 1.现在安装MySQL ——–下载最新版MySQL软件,将MySQL安装到系统目录中,记录当前安装目录; 如安装mysql到D:\wamp\mysql目录下 2.打开win7系统——右击计算机——单击属性-弹出win7系统页面 3.高级系统设置-环境变…

通过mysqldump备份数据库

使用mysqldump命令备份 mysqldump命令的作用是备份MySQL数据库。是将数据库中的数据备份成一个文本文件。表的结构和表中的数据将存储在生成的文本文件中。mysqldump命令的工作原理很简单。它先查出需要备份的表的结构,再在文本文件中生成一个CREATE语句。然后&…

ThinkPHP-保存生成的二维码

通过TP框架引入Qrcode插件,然后调用插件生成二维码,并保存1.引入qrcode插件: 2.功能页面-生成二维码按钮: 3.生成二维码-代码: 4.后台代码-通过vendor方法引入: //下载生成的二维码-引用方法1 pu…

工厂方法 Factory Method

背景:有一个应用框架,它可以向用户显示多个文档。在这个框架中,两个主要的抽象是类Application和Document.这两个类都是抽象的。客户必须通过它们的子类来做与举替应用相关的实现。 分析:因为被实例化的特定Document子类是与特定应…

解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真

通常我们拿到某个ECU的通信矩阵数据库文件,.dbc后缀名的文件。 直接使用CANdb Editor打开,可以很直观的读懂信号矩阵的信息,例如下图: 现在要把上图呈现的信号从.dbc文件中解析出来,供实现自动化仿真总线信号使用&…

linux命令——init 的使用用法

1.手动输入命令会执行相关操作 #init 0 - 停机(千万不能把initdefault 设置为0 ) #init 1 - 单用户模式 #init 2 - 多用户,没有 NFS 不联网#init 3 - 完全多用户模式(标准的运行级) #init 4 - 没有用到 #init 5 - X11 (xwindow) 图…

01-数据库基础

1 数据库系统概述 1.1 数据库的4个基本概念 数据(Data):数据库中存储的基本对象数据库(Database):长期储存在计算机内、有组织的、可共享的大量数据的集合。数据库管理系统(DBMS):用户与操作系统之间的一层…

linux命令——crontab的使用方法

一、crond简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检…

mongdb group聚合操作

1、数据准备 [{"goods_id":1,"cat_id":4,"goods_name":"KD876","goods_number":1,"click_count":7,"shop_price":1388.00,"add_time":1240902890},{"goods_id":4,"cat_id&quo…