mysql慢查询
开启慢查询对性能有影响,有影响但不是非常大。当发现性能问题时,可以开启一定时间的慢查询,如3天或一周。
开启慢查询,修改配置文件:
slow_query_log=1;
long_query_time=2;
为了能作用在所有连接上,可以修改配置文件后,写个批处理(右键属性改为以管理员身份运行),加入到系统的定时任务中,到凌晨自动重启即可。
net stop mysql
net start mysql
查看是否开启,以及慢查询日志的名字:
show global VARIABLES like "%slow_query_log%";
查看慢查询判定时间:
show global variables like "%long_query_time%";
查看数据目录:
show global VARIABLES like ‘datadir‘;
开启慢查询后,进行慢查询,生成的慢查询日志默认存在于数据目录中。
文件名:slow_query_log_file
是否开启:slow_query_log
时间限制(秒):long_query_time
数据目录变量:datadir,慢查询生成的日志文件默认是在这个数据目录中
得出的慢查询日志文件中,lock_time(等待锁的时间)和query_time(执行时间)的关系:
- 后者的时间包含了前者。
- 真正的执行时间 = query_time – lock_time
- 而且仅当真正的执行时间query_time – lock_time >= long_query_time的时候,才会记录为慢查询。
慢查询格式:
* 第一行,SQL查询执行的时间
* 第二行,执行SQL查询的连接信息,用户和连接IP
* 第三行,记录了一些我们比较有用的信息,如下解析
Query_time,这条SQL执行的时间,越长则越慢
Lock_time,在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间
Rows_sent,查询返回的行数
Rows_examined,查询检查的行数,越长就当然越费时间
* 第四行,设置时间戳,没有实际意义,只是和第一行对应执行时间。
* 第五行及后面所有行(第二个# Time:之前),执行的sql语句记录信息,因为sql可能会很长。
分析工具
mysql自带的分析工具mysqldump:
Window下使用的话,先安装perl环境,然后运行bin目录中mysqldumpslow.pl文件:perl mysqldumpslow.pl -h 查看使用帮助
pt工具集:
下载:https://github.com/percona/percona-toolkit
提供一系列mysql的运维工具。
pt-diskstats | 查看系统磁盘状态 |
pt-summary | 收集和显示系统概况 |
pt-deadlock-logger | 提取和记录mysql死锁信息 |
pt-index-usage | 分析日志中索引使用情况,并出报告 |
pt-online-schema-change | 在线修改表结构 |
pt-duplicate-key-checker | 列出并删除重复的索引和外键 |
以下以pt-query-digest为例,perl pt-query-digest "xx-slow.log",得出结果:
第一部分:整体概要信息
Overall:总共出现多少次查询
Unique:不同的有多少条
Range:日志记录的时间范围
Exec:执行时间,这个值包括了等待锁的时间
Lock:等待锁的时间
Sent:发送的行数
Examine:扫描的行数(M是百万,k是千)
Query size:执行的SQL的长度统计(如当前慢查询日志中,只记录了一条查询语句,则这个值就是这个查询语句字符串的长度)。
QPS:是这个工具预估出来的值,不是准确值
第二部分信息:某些查询在整体中的概要信息
第三部分:就是第二部分中具体到某个sql的信息统计