mysq常用l性能分析方法
- orzdba查看读写
./orzdba.pl --mysql -S /data/mysql30001/mysql.sock 语句查看读写命令数量,以及数据库TPS,传输的大小 - 查看processlist及其state
mysql -uroot -p -S /data/mysql30001/mysql.sock, 密码sitMysql
或者mysql -usa_test -pymtcs@2016 -S /data/mysql30001/mysql.sockselect * from information_schema.processlist;
show processlist; 该语句不显示全部语句
查看当前进程的SQL语句,注意其STATE (以下一段引用百度)
在processlist中,看到哪些运行状态时要引起关注,主要有下面几个:
状态 建议
copy to tmp table 执行ALTER TABLE修改表结构时 建议: 放在凌晨执行或者采用类似pt-osc工具
Copying to tmp table 拷贝数据到内存中的临时表,常见于GROUP BY操作时 建议: 创建适当的索引
Copying to tmp table on disk 临时结果集太大,内存中放不下,需要将内存中的临时表拷贝到磁盘上,形成 #sql***.MYD、#sql***.MYI(在5.6及更高的版本,临时表可以改成InnoDB引擎了,可以参考选项 default_tmp_storage_engine ) 建议: 创建适当的索引,并且适当加大 sort_buffer_size/tmp_table_size/max_heap_table_size
Creating sort index 当前的SELECT中需要用到临时表在进行ORDER BY排序 建议: 创建适当的索引
Creating tmp table 创建基于内存或磁盘的临时表,当从内存转成磁盘的临时表时,状态会变成:Copying to tmp table on disk 建议: 创建适当的索引,或者少用UNION、视图(VIEW)之类的
Reading from net 表示server端正通过网络读取客户端发送过来的请求 建议: 减小客户端发送数据包大小,提高网络带宽/质量
Sending data 从server端发送数据到客户端,也有可能是接收存储引擎层返回的数据,再发送给客户端,数据量很大时尤其经常能看见备注:Sending Data不是网络发送,是从硬盘读取,发送到网络是Writing to net 建议: 通过索引或加上LIMIT,减少需要扫描并且发送给客户端的数据量
Sorting result 正在对结果进行排序,类似Creating sort index,不过是正常表,而不是在内存表中进行排序 建议: 创建适当的索引
statistics 进行数据统计以便解析执行计划,如果状态比较经常出现,有可能是磁盘IO性能很差建议: 查看当前io性能状态,例如iowait
Waiting for global read lock FLUSH TABLES WITH READ LOCK整等待全局读锁 建议: 不要对线上业务数据库加上全局读锁,通常是备份引起,可以放在业务低谷期间执行或者放在slave服务器上执行备份
Waiting for tables,Waiting for table flush FLUSH TABLES, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE等需要刷新表结构并重新打开 建议: 不要对线上业务数据库执行这些操作,可以放在业务低谷期间执行
Waiting for lock_type lock
等待各种类型的锁:• Waiting for event metadata lock• Waiting for global read lock
• Waiting for schema metadata lock
• Waiting for stored function metadata lock
• Waiting for stored procedure metadata lock
• Waiting for table level lock
• Waiting for table metadata lock
• Waiting for trigger metadata lock
建议:比较常见的是上面提到的global read lock以及table metadata lock,建议不要对线上业务数据库执行这些操作,可以放在业务低谷期间执行。如果是table level lock,通常是因为还在使用MyISAM引擎表,赶紧转投InnoDB引擎吧
综上,查询中有Creat sort index就是有问题,可以优化,
原语句为
SELECT FavoriteId, UserId, SourceId, AddTime, Type, SellerId, ProductId
FROM `App_UserFavorite`
WHERE `Userid` = 20000215 and `AddTime` < '2017-03-22 11:42:14.893' order by `FavoriteId` desc limit 10
优化为
explain SELECT FavoriteId, UserId, SourceId, AddTime, Type, SellerId, ProductId
FROM `App_UserFavorite`
WHERE `Userid` = 20000215 and `AddTime` < '2017-03-22 11:42:14.893' order by `AddTime` desc limit 10
优化后就没有 Creat sort index
3. 查看执行计划 explain
示例:
explain SELECT FavoriteId, UserId, SourceId, AddTime, Type, SellerId, ProductId
FROM `App_UserFavorite`
WHERE `Userid` = 20000215 and `AddTime` < '2017-03-22 11:42:14.893' order by `FavoriteId` desc limit 10
详细Extra:
Using index condition; Using where; Using filesort |
explain SELECT FavoriteId, UserId, SourceId, AddTime, Type, SellerId, ProductId
FROM `App_UserFavorite`
WHERE `Userid` = 20000215 and `AddTime` < '2017-03-22 11:42:14.893' order by `AddTime` desc limit 10;
对比两条语句的执行计划,发现第一条的Extra中用到东西多于第二条语句。
Explain具体分析查看: Mysql执行计划EXPLAIN详解
4. mysql profile 调试sql
(1) 打开profile
set profile on
set session profiling=1;
(2)执行相关语句,例如 :
SELECT FavoriteId, UserId, SourceId, AddTime, Type, SellerId, ProductId
FROM `App_UserFavorite`
WHERE `Userid` = 20000215 and `AddTime` < '2017-03-22 11:42:14.893' order by `FavoriteId` desc limit 10;
(3)查看profile队列中的语句
show profiles
对应的QueryId是28
(4)查看具体消耗
show profile for query 28; //28为QueryId
可以看出具体时间消耗
5. 查找慢查询
select * from mysql.slow_log where start_time >'2017-3-22 16:50:20'
mysql.slow_log中会放所有慢查询语句,所以需要 用start_time筛选下。找到慢查询语句,就可以用3,4的方法分析。
6. SPIN_Lock监控
当mysql的并发大时出现性能瓶颈,应用程序并发从1开始加到100的情况,应用每次请求会从Mysql拿下数据,下图是Mysql服务器的CPU占用状况
可以看到SystemTime的占用很高,这种情况一般是Linux底层_spin_lock过高引起的,这种情况下,一般认为mysql已到瓶颈,增大并发,并不能提高TPS
_spin_lock是内核级的自旋锁,每个Mysql process都会申请_spin_lock,具体原理,还有待研究
监控_spin_lock方法
(1)安装perf工具
yum install perf
(2)查看mysql进程号
top
(3)监控
perf top -p 3127
mysq常用l性能分析方法的更多相关文章
- Android 常用的性能分析工具详解:GPU呈现模式, TraceView, Systrace, HirearchyViewer(转)
此篇将重点介绍几种常用的Android性能分析工具: 一.Logcat 日志 选取Tag=ActivityManager,可以粗略地知道界面Displaying的时间消耗.当我们打开一个Activit ...
- Android APP性能分析方法及工具
近期读到<Speed up your app>一文.这是一篇关于Android APP性能分析.优化的文章.在这篇文章中,作者介绍他的APP分析优化规则.使用的工具和方法.我觉得值得大家借 ...
- Java程序员常用Linux性能分析命令
性能分析 vmstat 虚拟内存统计 用法 Usage: vmstat [options] [delay [count]] Options: -a, --active active/inactive ...
- 页面装载js及性能分析方法
一.装载 先装载静态页面的引用js文件,然后查找引用文件中是否包含onload函数,比如main.js中包含onload函数,在main.js中查找是否有对其他js文件的引用,优先装载引用js文件,被 ...
- 转: 关于Linux常用的二进制文件分析方法
当你在unix下拿到一个二进制文件但不知道它是什么的时候,可以通过以下方法得到一此提示 1. 最首先应该尝试strings命令,比如拿到一个叫cr1的二进制文件,可以: $ strings cr1 | ...
- php代码性能分析方法
1.用到的函数 microtime() ,函数返回当前 Unix 时间戳和微秒数,本函数以 "msec sec" 的格式返回一个字符串,其中 sec 是自 Unix 纪元(0:00 ...
- Java性能分析方法
Java调优经验 http://www.rowkey.me/blog/2016/11/02/java-profile/
- CPU性能分析工具原理
转载请保留以下声明 作者:赵宗晟 出处:https://www.cnblogs.com/zhao-zongsheng/p/13067733.html 很多软件都要做性能分析和性能优化.很多语言都会有他 ...
- linux命令(4):top 命令(性能分析工具)
linux 的top命令详解 简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个 ...
随机推荐
- esri-leaflet入门教程(4)-加载各类图层
esri-leaflet入门教程(4)-加载各类图层 by 李远祥 在leaflet中图层一般分为底图(Basemap)和叠加图层(Overlay).前面章节已经介绍过底图其实也是实现了TileLay ...
- Hibernate基本原理
一.Hibernate是对JDBC进一步封装 原来没有使用Hiberante做持久层开发时,存在很多冗余,如:各种JDBC语句,connection的管理,所以出现了Hibernate把JDBC封装了 ...
- Android apk应用程序签名
Android apk应用程序签名 分类: Android 2012-11-25 19:33 570人阅读 评论(0) 收藏 举报 一.Android Apk签名 Apk签名首先要有一个keystor ...
- 初学ant
项目管理第二步——ant 自动化完成项目的构建 Ant1.7.chm Ant权威指南 Ant入门 Ant使用指南 Ant安装文件压缩包 dir 查看所有目录mkdir 创建目录 创建一个文 ...
- 剑指offer编程题Java实现——替换空格
题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. package ...
- 解析java泛型(二)
上篇我们简单的介绍了java中泛型的最基本的内容,知道了什么是泛型以及泛型对我们的程序编写有什么好处,最后一类型限定收尾.本篇将从类型限定开始阐述java泛型中很重要的概念:通配符 一.何为通配符 ...
- window编程之win程序框架
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmd ...
- 第十六篇 基于Bootstarp 仿京东多条件筛选插件的开发(展示上)
这几天学习Bootstrap,本来是两年前的用的东西,现在又重新拾起来,又有很多重新的认识,看了Bootstrap的样式偏多,插件现在还没有学习到几个,也有写几个插件自己用的想法.正好工作上也会用到, ...
- Java设计模式之《外观模式》及应用场景
原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6484128.html 1.外观模式简介 外观模式,一般用在子系统与访问之间,用于对访问屏蔽复 ...
- 在Signalr的Hub中写方法实现与安卓的数据交互
简介: 实现数据实时刷新:SignalR 后台服务:.NET/WebAPI 为了减轻web的压力,将接口中接收数据的方法写到SignalR的Hub中 在此放一小段代码给自己加深下印象,博主有点健忘.. ...