同一条sql语句,为什么有时插入块,有时插入慢原因剖析

背景:同一条sql ,有时插入时间几毫秒,有时插入时间几十毫秒,为什么?

Sql角度:简单insert

表角度: 一个主键

系统参数角度:

开启了双1 策略。

也就意味着每次事物就会有刷新磁盘

关闭双1 ,设置为 0 100 ,或者 2 100 ,会极大提升性能。这是因为不刷硬盘了,但不能解决为什么时快时慢问题

操作系统角度

iostat -xmd 1  看磁盘

磁盘 不够快啊。 读写0.15M 就使用了7%

来个顺序文件拷贝, 30M 使用 100%。 离散读写更慢了

使用sar -B 1 可以查看页面交换

pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)

pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)

fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)

majflt/s:每秒钟产生的主缺页数.

pgfree/s:每秒被放入空闲队列中的页个数

pgscank/s:每秒被kswapd扫描的页个数

pgscand/s:每秒直接被扫描的页个数

pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数

%vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比

这表示 内存和 swap 或者硬盘 有频繁的数据交换

2 哪个进程使用swap 呢

for i in $(ls /proc | grep "^[0-9]" | awk '$0>100'); do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps;done| sort -k2nr | head

在经过 几个小时后 ,mysql 使用 swap 由 88M 变成了104M , 说明一直在使用和增加的。

问题基本定位

  1. 首先是磁盘性能不高,顺序写才30M ,离散写会降低10倍
  2. 其次是mysql又使用了swap 空间,这就使得性能更差
  3. Mysql 开启了双1 验证,就会等待数据刷磁盘,

磁盘使用频率不稳定,导致了mysql的插入时间会时快时慢

如何解决

  1. 减少mysql使用swap 方式

     把swapness 降为1

    sysctl vm.swappiness=1     并且 /etc/sysctl.conf  中设置为1

  2  降低内存 innodb_buffer_pool_size =4G  原来6G ,节约一部分内存空

  3 开启innodb_numa_interleave = ON    来操作numa

       4 更换SSD 或者不用开启双1,改成 2  100

只调整操作系统参数,不更换硬件,依然开启双一,重启mysql之后呢

可以看到mysql已经不再使用 swap 空间了

但是因为双一参数的使用,每次事物都会刷磁盘,而这个机械磁盘的性能在随机读写的情况下不稳定。会依然存在时快时慢的问题。

同一条sql insert 有时快有时慢 引发的血案的更多相关文章

  1. Oracle一条SQL语句时快时慢

    今天碰到一个非常奇怪的问题问题,一条SQL语句在PL/SQL developer中很慢,需要9s,问题SQL: SELECT * FROM GG_function_location f WHERE f ...

  2. 【MySQL】10条SQL优化语句,让你的MySQL数据库跑得更快!

    慢SQL消耗了70%~90%的数据库CPU资源: SQL语句独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低: SQL语句可以有不同的写法: 1 不使用子 ...

  3. 10条SQL优化语句,让你的MySQL数据库跑得更快!

    慢SQL消耗了70%~90%的数据库CPU资源: SQL语句独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低: SQL语句可以有不同的写法: 1 不使用子 ...

  4. Oracle是如何工作的?实例是如何响应用户请求?一条SQL的执行过程~

    Oracle 是如何工作的? Select id,name from t order by id ; – SQL 解析(查看语法是否错误,如果没有错误,分析语意,执行此语句的权限) – 执行计划(OR ...

  5. MySQL中一条SQL的加锁分析

    MySQL中一条SQL的加锁分析 id主键 + RC id唯一索引 + RC id非唯一索引 + RC id无索引 + RC id主键 + RR id唯一索引 + RR id非唯一索引 + RR id ...

  6. 一条 sql 的执行过程详解

    写操作执行过程 如果这条sql是写操作(insert.update.delete),那么大致的过程如下,其中引擎层是属于 InnoDB 存储引擎的,因为InnoDB 是默认的存储引擎,也是主流的,所以 ...

  7. Mysql 52条SQL语句性能优化策略汇总

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行null值判断,创建表时NULL是默认值,但大多数时候应 ...

  8. 阿里一面,给了几条SQL,问需要执行几次树搜索操作?

    前言 有位朋友去阿里面试,他说面试官给了几条查询SQL,问:需要执行几次树搜索操作?我朋友当时是有点懵的,后来冷静思考,才发现就是考索引的几个基础知识点~~ 本文我们分九个索引知识点,一起来探讨一下. ...

  9. 52 条 SQL 语句性能优化策略,建议收藏

    本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行nul ...

随机推荐

  1. go使用错误概览

    1. 解决:GO语言中要提供给外面访问的方法或是结构体必须是首字母大写.这个结构体只有结构体名大写了,而里面的字段没有首字母大写,而GO语言在模板调用时应该认为是两个不同的过程,所以找不到值.于是把结 ...

  2. 线段树 区间查询区间修改 poj 3468

    #include<cstdio> #include<iostream> #include<algorithm> #include<string.h> u ...

  3. BT详解,BT原理

    请参考以下链接: https://www.cnblogs.com/EasonJim/p/6601146.html

  4. 程序员过年必备 -- Auto.js微信自动抢红包

    打开微信就不用管了: - 自动打开未读消息 - 自动滑动屏幕检测红包 - 自动跳过无效红包 基于Auto JS,apk版本4.01: - 大多数动作均基于控件 - 极个别点击基于动态抓取的坐标 - 这 ...

  5. jmeter实现服务器端后台接口性能测试

    实现目的 在进行服务器端后台接口性能测试时,需要连接到Linux服务器端,然后通过命令调用socket接口,这个过程就需要用到jmeter的SSH Command取样器实现了. 脚本实现 设置CSV ...

  6. Java内存模型(JMM)那些事

    本文是库存文章,去年年底学习了慕课网的并发编程课程,今年年初看完了<深入理解Java虚拟机>这本书,但是很多内容忘得差不多了,打算写写博客回忆一下那些忘在脑后的知识点. 温故而知新 更多J ...

  7. 零基础入门python爬虫(一)

    ✍写在前面: 欢迎加入纯干货技术交流群Disaster Army:317784952 接到5月25日之前要交稿的任务我就一门心思想写一篇爬虫入门的文章,可是我并不会.还好有将近一个月的时间去学习,于是 ...

  8. C# 篇基础知识9——特性、程序集和反射

    特性(Attribute)是用于为程序元素添加额外信息的一种机制.比如记录文件修改时间或代码作者.提示某方法已经过期.描述如何序列化数据等等.方法.变量.属性.类.接口.结构体以及程序集等都是程序元素 ...

  9. 3、示例(在java中使用JSON)

    教程链接(json-smple1.1.1.jar文件) 链接:http://pan.baidu.com/s/1qXPbYHm 密码:v0f0 如何使用java编程语言编码和解码JSON 首先准备环境以 ...

  10. UVa 400 Unix Is命令

    简单题 #include <bits/stdc++.h> using namespace std; const int maxn=110; string s[maxn]; int main ...