#!/usr/bin/python
#!coding:utf-8 import mysql.connector as connector
import json """
目标 : 这个工具用于分析MySQL实例的性能问题
作者 : 蒋乐兴
QQ : 1721900707
版本信息 : 基于python3.4 MySQL 5.7.11
MySQL用户要用到的一些权限:
create user admin@'127.0.0.1' identified by '131417';
grant select on performance_schema.* to admin@'localhost';
""" show_golbal_value="select variable_name,variable_value from performance_schema.global_variables where variable_name= %s"
show_global_statu="select variable_name,variable_value from performance_schema.global_status where variable_name= %s" def analyse_innodb_cache(cursor,results):
'''
用于分析innodb_buffer_pool的缓存命中率
'''
#查询出innodb_buffer_pool_read_requests
cursor.execute(show_global_statu,('Innodb_buffer_pool_read_requests',))
key,value=cursor.fetchone()
innodb_buffer_pool_read_requests=value
#查询出Innodb_buffer_pool_reads
cursor.execute(show_global_statu,('Innodb_buffer_pool_reads',))
key,value=cursor.fetchone()
Innodb_buffer_pool_reads=value
#计算结果
innodb_buffer_pool_hit_rate=float(innodb_buffer_pool_read_requests)/(float(innodb_buffer_pool_read_requests)+float(Innodb_buffer_pool_reads))
#组织结果
tempResult={}
tempResult['innodb_buffer_pool_read_requests']=innodb_buffer_pool_read_requests
tempResult['Innodb_buffer_pool_reads']=Innodb_buffer_pool_reads
tempResult['innodb_buffer_pool_hit_rate']=innodb_buffer_pool_hit_rate results['innodb_buffer_pool_hit_rate']=tempResult def analyse_query_no_use_index(curosr,results):
"""
用于分析没有用索引的查询,最多只返回8条没有使用索引的SQL;执行次数越多的SQL在结果集中越靠前。
"""
query="select digest_text,sum_no_index_used from performance_schema.events_statements_summary_by_digest where sum_no_index_used>=1 and digest_text not like 'SHOW%' order by sum_no_index_used desc limit 8"
cursor.execute(query)
index=0
tempResult={}
for digest_text,sum_no_use_index in curosr:
tempResult[index]=digest_text
index=index+1
results['analyse_query_no_use_index']=tempResult def analyse_query_cache(cursor,results):
"""
本函数用于分析mysql实例的查询缓存、如果query_cache_type=0说明没有开启这个工能,那么分析结束。
不然要分析查询缓存的剩余内存,和命中率。把分析的结果包装到results变量中。
"""
analysis_var=("query_cache_type",)
cursor.execute(show_golbal_value,analysis_var)
key,value=cursor.fetchone()
#如果value的值等于OFF、说明本实例并没有开启查询缓存。
if value=='OFF':
results['query_cache']='query cache function not in use for this instance'
else:
#如果逻辑走到了这里说明、实例开启了查询缓存
#Qcache_free_memory 对应着剩余的查询缓存内存。
cursor.execute(show_global_statu,("Qcache_free_memory",))
key,value = cursor.fetchone()
#由于这个是延时计算的;所以查出来就要把它用掉。********************
Qcache_free_memory=value
#query_cache_size 对应着查询缓存的内存大小。
cursor.execute(show_golbal_value,("query_cache_size",))
key,value = cursor.fetchone();
query_cache_size=value
#用于查询缓存的内存空闲率
if float(query_cache_size) != 0:
query_cache_memory_free_rate=float(Qcache_free_memory)/float(query_cache_size)
else:
query_cache_memory_free_rate=None
#Qcache_hits 对应着命中的次数
cursor.execute(show_global_statu,("Qcache_hits",))
key,value=cursor.fetchone()
Qcache_hits=value
#Qcache_inserts 对应的没有命中的次数----由于没有命中所以要插入。
cursor.execute(show_global_statu,("Qcache_inserts",))
key,value=cursor.fetchone()
Qcache_inserts=value
#查询缓存的命中率为
if float(Qcache_hits+Qcache_inserts) != 0:
query_cache_hit_rate=float(Qcache_hits)/float(Qcache_hits+Qcache_inserts)
else:
query_cache_hit_rate=None
#组织结果
tempResult={}
tempResult['Qcache_free_memory']=Qcache_free_memory
tempResult['query_cache_size']=query_cache_size
tempResult['query_cache_memory_free_rate']=query_cache_memory_free_rate
tempResult['Qcache_hits']=Qcache_hits
tempResult['Qcache_inserts']=Qcache_inserts
tempResult['query_cache_hit_rate']=query_cache_hit_rate
results['query_cache']=tempResult analysis_function_sets={
'anaylsis_query_cache':analyse_query_cache,
'analyse_query_no_use_index':analyse_query_no_use_index,
'analyse_innodb_cache':analyse_innodb_cache
} if __name__=="__main__":
cnx=None
cursor=None
config={
'host':'127.0.0.1',
'port':3306,
'user':'admin',
'password':''
}
results={}
try:
cnx=connector.connect(**config)
cursor=cnx.cursor(buffered=True)
for key,function in analysis_function_sets.items():
print('start analyse {0}'.format(key))
function(cursor,results)
print(json.dumps(results))
except Exception as err:
print(err)
finally:
if cnx != None:
cnx.close()
cursor.close()

MySQL性能分析脚本的更多相关文章

  1. MySQL性能分析, mysql explain执行计划详解

    MySQL性能分析 MySQL性能分析及explain用法的知识是本文我们主要要介绍的内容,接下来就让我们通过一些实际的例子来介绍这一过程,希望能够对您有所帮助. 1.使用explain语句去查看分析 ...

  2. MySQL性能分析及explain的使用

    MySQL性能分析及explain用法的知识 1.使用explain语句去查看分析结果 如explain select * from test1 where id=1;会出现:id  selectty ...

  3. MySQL性能分析及explain的使用说明

    1.使用explain语句去查看分析结果 如explain select * from test1 where id=1;会出现:id selecttype table type possible_k ...

  4. mysql性能分析show profile/show profiles

    MySQL性能分析show profiles show profile 和 show profiles 语句可以展示当前会话(退出session后,profiling重置为0) 中执行语句的资源使用情 ...

  5. MySQL性能分析和优化-part 1

    MySQL性能优化 平时我们在使用MySQL的时候,怎么评估系统的运行状态,怎么快速定位系统瓶颈,又如何快速解决问题呢? 本文总结了多年来MySQL优化的经验,系统介绍MySQL优化的方法. OS性能 ...

  6. MySQL性能分析、及调优工具使用详解

    本文汇总了MySQL DBA日常工作中用到的些工具,方便初学者,也便于自己查阅. 先介绍下基础设施(CPU.IO.网络等)检查的工具: vmstat.sar(sysstat工具包).mpstat.op ...

  7. mysql性能分析工具

    一.EXPALIN 在SQL语句之前加上EXPLAIN关键字就可以获取这条SQL语句执行的计划 那么返回的这些字段是什么呢? 我们先关心一下比较重要的几个字段: 1. select_type 查询类型 ...

  8. MySQL性能分析(转)

    第一步:检查系统的状态 通过操作系统的一些工具检查系统的状态,比如CPU.内存.交换.磁盘的利用率.IO.网络,根据经验或与系统正常时的状态相比对,有时系统表面上看起来看空闲,这也可能不是一个正常的状 ...

  9. mysql性能分析-------profiling和explain

    1. profiling之性能分析 MySQL5.0.37版本以上支持了Profiling – 官方手册.此工具可用来查询 SQL 会执行多少时间,System lock和Table lock 花多少 ...

随机推荐

  1. Stack的三种含义(数据超过栈的大小,就发生stack overflow)

    非常典型的基础知识,转自http://www.ruanyifeng.com/blog/2013/11/stack.html 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈& ...

  2. C++调用DLL有两种方法——静态调用和动态调用

    C++调用DLL有两种方法——静态调用和动态调用 标签: dllc++winapinullc 2011-09-09 09:49 11609人阅读 评论(0) 收藏 举报  分类: cpp(30)  [ ...

  3. [置顶] 如何运行用记事本写的java程序

               今天用记事本写了一个java程序,测试能运行,现在把它分解成几个步骤,利于大家理解:           1. 新建一个记事本,后缀名是  .java  :然后在里面写一段jav ...

  4. Eclipse Tomcat : Project facet Java version 1.7 is not supported.

    在Eclipse打开一个项目,并用Tomcat运行时,报错:Project facet Java version 1.7 is not supported. 大致的截图如下: "项目中的jd ...

  5. JavaScript 类私有方法的实现

    一:将私有方法移出模块,因为模块内部的所有方法都是对外可见的. class Widget { foo (baz) { bar.call(this, baz); } // ... } function ...

  6. (转)Eclipse/Myeclipse 注释注释模板

    Window -->preferences --> Java --> Code Style --> Code Templates --> Comments --> ...

  7. AndroidUI开源组件库BottomView 第三方自定义UI控件

    这里分享一个Android的非常经典实用而且简单方便的第三方UI控件库:BottomView(小米的米UI也用到了这个) 原文  http://blog.csdn.net/opzoonzhuzheng ...

  8. Java正則表達式语法

    Java正則表達式语法 字符 说明 \ 将下一字符标记为特殊字符.文本.反向引用或八进制转义符.比如,"n"匹配字符"n"."\n"匹配换行 ...

  9. ssh远程登录linux live系统

    要想ssh远程登录,须要准备两件事:配置同网段IP和开启SSH服务. 因为live系统没有IP,所以首先须要配置IP. 我的live系统是在虚拟机上启动的,宿主IP为192.168.230.1,liv ...

  10. 深入浅出 RPC - 深入篇

    <深入篇>我们主要围绕 RPC 的功能目标和实现考量去展开,一个基本的 RPC 框架应该提供什么功能,满足什么要求以及如何去实现它? RPC 功能目标 RPC 的主要功能目标是让构建分布式 ...