MySQL参数优化案例

时间:2022-02-09 17:57:27


环境介绍

硬件配置

cpu核心数 内存大小 磁盘空间
16核 256G 3T

软件环境

操作系统版本 mysql版本 表数目 单表行数
centos-7.4 mysql-5.7.22 128张表 2kw行

优化层级与指导思想

优化层级

MySQL数据库优化可以在多个不同的层级进行,层级的常见分法有1):SQL优化 2):参数优化 3):架构优化;本文重点关注第2层,并通过一次完整的优化案例来讲解参数优化的内在逻辑。


指导思想

1、日志先行 -- 一个事务能否成功提交的关键是与它相关的日志是否成功落盘,与数据没有太大的关系;也就是说对写的优化可以表述为各方面的资源向写操作倾斜。

2、瓶颈分析 -- 通过show global status 的各个计数器的值基本上就能分析出当前瓶颈所在,再结合一些简单的系统层面的监控工具如top iostat 等通常就能明确瓶颈。

3、整体性能是“读”&“写”之间的再平衡。


优化过程

最小化安装情况下的性能表现

my.cnf中的内容

MySQL参数优化案例图像地址: http://www.sqlpy.com/mysqlz/tuninglog/result/cm16c256g4096ssd/0/

监控数据

分析&优化思路

对监控数据有两种可能的解释:1): 由于最小化的安装的buffer_pool_size比较小,所以会频繁的触发innodb_buffer_pool的最大脏页的限制,使得innodb进入爆力刷盘的模式,这种情况下io使用率会明显上升。2): redo日志重用。 最终的影响可能是两者的叠加,这里先从buffer_pool开始优化。


优化innodb_buffer_pool_size

my.cnf中的内容

MySQL参数优化案例图像地址:http://www.sqlpy.com/mysqlz/tuninglog/result/cm16c256g4096ssd/1/

监控数据

调整innodb_buffer_pool_size前后的性能对比 MySQL参数优化案例性能大概提高3倍 图像地址:http://www.sqlpy.com/mysqlz/tuninglog/compare/cm16c256g4096ssd/0/1/

分析&优化思路

1、针对innob_buffer_pool_size的调整取得了一定的收获,下面将要调整的就是针对redo重用的情况了,也就是说我们要增大innodb_log_files_in_group和innodb_log_file_size到一个合适的值。

2、innob_buffer_pool_size的调整取得了一定的收获还可以更进一步,那就是增大innodb_buffer_pool_instances的值。


优化innodb_log_files_in_group&innodb_log_file_size

根据对之前测试的记录每完成一组测试LSN增大4.5G、持续时间大概是5分钟;理论上把redo文件增大到5G可以做到整个测试的过程中不发生日志重用、这样的话测试的跑分会更高,不过这个会影响数据库宕机恢复的时间。MySQL在默认配置下innodb_log_files_in_group=2,innodb_log_file_size=48M也就是说跑完一组测试redo日志要刷新48轮(1024*4.5/96 ==48) 先看一下把日志刷新调整到9轮的情况。

my.cnf中的内容

MySQL参数优化案例图像地址:http://www.sqlpy.com/mysqlz/tuninglog/result/cm16c256g4096ssd/2/

调整innodb_log_files_in_group&innodb_log_file_size前后的性能对比 MySQL参数优化案例性能大概提高2倍 图像地址:http://www.sqlpy.com/mysqlz/tuninglog/compare/cm16c256g4096ssd/1/2/

现在看一下日志重用控制在一轮(5G)之内的性能表现

my.cnf中的内容

MySQL参数优化案例调整innodb_log_files_in_group&innodb_log_file_size前后的性能对比 MySQL参数优化案例性能大概提高2倍图像地址:http://www.sqlpy.com/mysqlz/tuninglog/compare/cm16c256g4096ssd/2/3/

分析&优化思路

1、增大redo到5G的情况下由于整个测试过程中几乎没有日志文件重用的问题,这样也就规避由些引发的大量数据刷盘行为,所以性能曲线也就更平滑了。

2、通过show global status 发现Table_open_cache_overflows=200W+、Thread_created=2k+

3、%Cpus : 80.5 us, 13.8 sy, 0.0 ni, 5.4 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st 95%的使用率cpu资源成了大问题,这个使用率下能调整的参数不多了

3、对磁盘的监控数据表明util的峰值已经下降到14%、磁盘已经不在是问题;所以针对innodb_buffer_pool_size、innodb_log_files_in_group&innodb_log_file_size 这两次优化的进入一步优化innodb_buffer_pool_instances、innodb_log_buffer_size 先不进行;在些采用“抓大放小”的方式先调整表缓存。

优化table_open_cache&table_open_cache_instances&innodb_sync_spin_loops&thread_cache_size

由于cpu使用率达到了95%看到这个数值有一种发自内心的无力感,所以打算所目前status中能明确的一些问题直接一起调整了;增大table_open_cache&table_open_cache_instances用于优化表缓存、增大thread_cache_size使用cpu不用频繁的创建消毁线程、增大innodb_sync_spin_loops是希望尽可能的避免上下文切换(由于目前的监控粒度不是特别细所以无法给出13.8%中有多少是上下文切换)也就是说增大innodb_sync_spin_loops更多的是出于职业判断

my.cnf中的内容

MySQL参数优化案例调整前后的比较 MySQL参数优化案例

总结

考虑到cpu使用率已经达到95%且增加物理cpu不现实的情况下,决定MySQL参数优化到些为止了;最后来看一眼这次优化成果。 MySQL参数优化案例


作者:

作者: 蒋乐兴

时间: 2018-05-08

个人网站: www.sqlpy.com

MySQL参数优化案例的更多相关文章

  1. MySQL参数优化

    目前针对MySQL数据库进行了一些参数优化,具体如下: my.ini / my.cnf 参数说明 #使用查询缓存 query_cache_size=100M                     # ...

  2. MySQL filesort优化案例一则

    今天遇到一个filesort优化的案例,感觉不错,分享出来. MySQL中filesort是什么意思?官方手册定义: MySQL must do an extra pass to find out h ...

  3. Linux记录-mysql参数优化

    1.参数优化show variables like ''/etc/my.cnf[mysqld]Max_connections =1024 #请求的最大连接数back_log =1024 #mysql能 ...

  4. MySQL索引优化案例浅析

    MySQL是关系型数据库的一种,查询功能强,数据一致性高,数据安全性高,支持二级索引.但是性能比起非关系型数据库稍弱,特别是百万级以上的数据,很容易出现查询慢的现象.这时候要分析慢的原因,一般情况下是 ...

  5. mysql参数优化记录

    服务器参数16G内存,4核CPUvim /etc/my.cnf 原: back_log=170 max_connections=600 max_user_connections=0 thread_co ...

  6. MySQL索引优化案例

    这里我们分成三种情况进行分析,分别是单表,两表,三表 1.单表 CREATE TABLE IF NOT EXISTS `article`( `id` ) NOT NULL PRIMARY KEY AU ...

  7. 【MySQL参数优化】根据架构优化

    根据MySQL的架构优化 参数调整的最终效果: 1)SQL执行速度足够快 2)业务吞吐量足够高:TPS,QPS 3)系统负载可控,合理:cpu,io负载 在调整参数的时候,应该熟悉mysql的体系架构 ...

  8. mysql之 CentOS系统针对mysql参数优化

    内核相关参数(/etc/sysctl.conf)  以下参数可以直接放到sysctl.conf文件的末尾: net.core.somaxconn = 65535 net.core.netdev_max ...

  9. MySQL参数优化:back_log

    * 修改back_log参数值:由默认的50修改为500.(每个连接256kb, 占用:125M) back_log=500 查看mysql 当前系统默认back_log值,命令: show vari ...

随机推荐

  1. solr 主从模式和solrcloud集群模式

    主从模式 主节点有单点故障问题:没有主从自动切换,没有failover,主机down掉了的话,整个数据变成只读.并且需要一台机单独做索引,浪费资源,所有数据都需要在这台机器上单独存在一份,索引变化较大 ...

  2. [百度空间] [原]android下的各种坑

    一堆so文件安装不正确: apk里面都是全的, 但是安装完后/data/data/$pkg/lib下面就没有 google了好长时间没有结果.最后发现是因为没库有加lib前缀(当时想了一下觉得不加更好 ...

  3. gcc / g++ 编译选项

    g++ -Wall -m64 -W -O2 a.cpp b.cpp -o a 用下面的命令编译,生成libtriangle.so  先生成动态库 g++ -g -fpic -shared -o lib ...

  4. 在NPAPI开发火狐浏览器插件在NPAPI插件

    1.插件是什么 插件是一种遵循一定规范的应用程序接口编写出来的程序.插件必须依附于一个宿主程序,为宿主程序提供增强功能.插件的种类有很多,这里主要讨论浏览器插件. IE下利用OLE和COM技术开发的浏 ...

  5. Nopcommerce 3.7 增加了Redis 作为缓存啦

    Nopcommerce 3.7  版增加了Redis 缓存,相比之前内存缓存, 感觉使用了Redis 作为缓存,明显加快了Web页面响应速度! 废话少说 拉代码: 1 git clone https: ...

  6. java工程师联通XX面试题目

    什么是“长连接”和“短连接”? 所谓短连接指建立SOCKET连接后发送后接收完数据后马上断开连接,一般银行都使用短连接解释2长连接就是指在基于tcp的通讯中,一直保持连接,不管当前是否发送或者接收数据 ...

  7. Material使用02 图标MdIconModule、矢量图作为图标使用及改进

    1 MdIconModule模块的使用 1.1 在需要用到的模块中引入Material图标模块 import { BrowserModule } from '@angular/platform-bro ...

  8. 如何配置springboot一访问服务器本地图片

    大家好,之前写过一篇配置tomcat访问服务器本地资源的,但现在使用了springboot内嵌tomcat\jeyyt后,怎么来访问本地资源呢? 打好springboot框架后,在applicatio ...

  9. HotSpot 虚拟机垃圾回收算法实现

    作为使用范围最广的虚拟机之一HotSpot,必须对垃圾回收算法的执行效率有严格的考量,只有这样才能保证虚拟机高效运行 枚举根节点 从可达性分析中从 GC Roots 节点找引用链这个操作为例,可以作为 ...

  10. JavaScript是如何工作的:深入类和继承内部原理 + Babel和TypeScript 之间转换

    这是专门探索 JavaScript 及其所构建的组件的系列文章的第 15 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...