1. orzdba查看读写
    ./orzdba.pl --mysql -S /data/mysql30001/mysql.sock 语句查看读写命令数量,以及数据库TPS,传输的大小
  2. 查看processlist及其state
    mysql -uroot -p -S /data/mysql30001/mysql.sock, 密码sitMysql
    或者
     mysql -usa_test -pymtcs@2016 -S  /data/mysql30001/mysql.sock

    select * 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性能分析方法的更多相关文章

  1. Android 常用的性能分析工具详解:GPU呈现模式, TraceView, Systrace, HirearchyViewer(转)

    此篇将重点介绍几种常用的Android性能分析工具: 一.Logcat 日志 选取Tag=ActivityManager,可以粗略地知道界面Displaying的时间消耗.当我们打开一个Activit ...

  2. Android APP性能分析方法及工具

    近期读到<Speed up your app>一文.这是一篇关于Android APP性能分析.优化的文章.在这篇文章中,作者介绍他的APP分析优化规则.使用的工具和方法.我觉得值得大家借 ...

  3. Java程序员常用Linux性能分析命令

    性能分析 vmstat 虚拟内存统计 用法 Usage: vmstat [options] [delay [count]] Options: -a, --active active/inactive ...

  4. 页面装载js及性能分析方法

    一.装载 先装载静态页面的引用js文件,然后查找引用文件中是否包含onload函数,比如main.js中包含onload函数,在main.js中查找是否有对其他js文件的引用,优先装载引用js文件,被 ...

  5. 转: 关于Linux常用的二进制文件分析方法

    当你在unix下拿到一个二进制文件但不知道它是什么的时候,可以通过以下方法得到一此提示 1. 最首先应该尝试strings命令,比如拿到一个叫cr1的二进制文件,可以: $ strings cr1 | ...

  6. php代码性能分析方法

    1.用到的函数 microtime() ,函数返回当前 Unix 时间戳和微秒数,本函数以 "msec sec" 的格式返回一个字符串,其中 sec 是自 Unix 纪元(0:00 ...

  7. Java性能分析方法

    Java调优经验 http://www.rowkey.me/blog/2016/11/02/java-profile/

  8. CPU性能分析工具原理

    转载请保留以下声明 作者:赵宗晟 出处:https://www.cnblogs.com/zhao-zongsheng/p/13067733.html 很多软件都要做性能分析和性能优化.很多语言都会有他 ...

  9. linux命令(4):top 命令(性能分析工具)

    linux 的top命令详解 简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个 ...

随机推荐

  1. canvas绘制圆形进度条(或显示当前已浏览网页百分比)

    使用canvas绘制圆形进度条,或者是网页加载进度条 或者是显示你浏览了本网页多少-- 由于个浏览器的计算差异,打开浏览器时 初始值有所不同,但是当拉倒网页底部时,均显示100%. 兼容性:测试浏览器 ...

  2. Android jni 编程1(对基本类型字符串的操作)

    最近一直在学安卓的jni,主要参考的是黑马程序员的视频教程,讲的确实不错. 那就自己总结一下吧,算是对学习的复习. 这篇博客也主要参考了这位博主:http://www.cnblogs.com/acti ...

  3. stringBuffer的使用及字符串比较的区别

    /* * 关于equals()和==: 对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true; * 而==是比较两字符串的地址是否相同,也就是是否是同一个字符串的 ...

  4. [Linux] PHP程序员玩转Linux系列-lnmp环境的搭建

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 在平常的工作中,我作为PHP程序员经常要搭建一下环境,这个环境就是Linux系统下安装nginx,php,mysql这三个软件,对软件进行 ...

  5. android学习19--Matrix.mapPoints作用

    android图形的旋转,缩放,平移都是用matrix实现的.可以用mapPoints来计算一个点旋转,缩放,平移后的坐标.看下面例子. Matrix matrix = new Matrix(); m ...

  6. android学习10——对顶点着器和片段着色器的理解

    图形都是点,线,面组成的.顶点着器指定了顶点的位置,大小和颜色. 看一个顶点着色器的代码 attribute vec4 a_Position; attribute float a_PointSize; ...

  7. flume-sink报错 java.lang.IllegalStateException: close() called when transaction is OPEN - you must either commit or rollback first

    1. 确认代码无误(根据情况修改,表示若获得不了数据不会自动commit或者rollback): Event event = channel.take(); if (event == null) { ...

  8. ShiWangMeSDK Android版接口文档 0.2.0 版

    # ShiWangMeSDK Android版接口文档 0.2.0 版 android 总共有 14 个接口,分别涉及到初始化和对界面的一些细节的控制.下面详细介绍接口,如果没有特殊说明,接口都在 S ...

  9. 在.NET Core 上运行的 WordPress

    在.NET Core 上运行的 WordPress,无需安装PHP既可跨平台运行WordPress. 在Peachpie中实现PHP所需的功能数月后,现在终于可以运行一个真实的应用程序:WordPre ...

  10. 使用moy快速开发后台管理系统(一)

    moy是什么? moy 是基于模型框架 kero 和 UI 框架 neoui 实现的应用框架,是前端集成解决方案,为企业级应用开发而生.github地址:iuap-design/tinper-moy ...