#!/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. 指定Action、Category调用系统Activity

    1.Intent对象详解 Android的应用程序包含三种重要组件:Activity.Service.BroadcastReceiver,应用程序采用一致的方式来启动它们----都是依靠Intent来 ...

  2. Entity Framework with MySQL 学习笔记一(查询)

    参考 : http://msdn.microsoft.com/en-us/data/jj574232.aspx EF 查询基本上有3中 默认是 Lazy Loading 特色是只有在需要数据的时候EF ...

  3. linux文件合并,去重,分割

    第一:两个文件的交集,并集前提条件:每个文件中不得有重复行1. 取出两个文件的并集(重复的行只保留一份)2. 取出两个文件的交集(只留下同时存在于两个文件中的文件)3. 删除交集,留下其他的行1. c ...

  4. Altium Designer 等长线&&蛇形线

    Altium Designer 里面怎么画等长线 (1)一般是将走线布完后,新建一个class. Design -> Classes 如上图添加完后可以点击close. (2)快捷键 T + R ...

  5. 18个SaaS及其功能评价

    SAAS软件及其功能评价1. 360 两个同步功能都不错,却被埋没了2. 够快云3. DBFen4. Seafile5. 坚果云6. DZ7. 百度云8. 1159. 迷你云10. 微云11. Dro ...

  6. 在VC中检测内存泄漏

    声明:checkleaks.h和checkleaks.cpp这两个文件中的代码是在网上COPY的,但原来那个网站现在却找不到了 所以,这篇文章不算完全原创,呵呵. 就当作是一个存档吧 先上代码: // ...

  7. 将汉字转为UTF-8编码

    01./** 02. * 将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名. 03. * @param s 原文件名 04. * @return 重新编码后的文件名 05. */ ...

  8. OSI七层结构

  9. 模拟Vue之数据驱动2

    一.前言 在随笔“模拟Vue之数据驱动1”结尾处,我们说到如果监听的属性是个对象呢?那么这个对象中的其他属性岂不就是监听不了了吗? 如下: 倘若user中的name.age属性变化,如何知道它们变化了 ...

  10. hand第四次考核

    使用Spring与Mybatis技术实现下要求: (2分)1,Spring的配置文件名称为ApplicationContext.xml (2分)2,在ApplicationContext.xml中配置 ...