mysql突然出现慢sql_Mysql开启慢SQL并分析原因

第一步.开启mysql慢查询

方式一:修改配置文件

Windows:Windows 的配置文件为 my.ini,一般在 MySQL 的安装目录下或者 c:\Windows 下。

Linux:Linux 的配置文件为 my.cnf ,一般在 /etc 下

在 my.ini 增加几行:

[mysqlld]

long_query_time=2

#5.0、5.1等版本配置如下选项

log-slow-queries="mysql_slow_query.log"

#5.5及以上版本配置如下选项

slow-query-log=On

slow_query_log_file="mysql_slow_query.log"

log-query-not-using-indexes

第一句使用来定义查过多少秒的查询算是慢查询,我这里定义的是2秒

第二句使用来定义慢查询日志的路径(因为是windows,所以不牵涉权限问题)

第三句就是记录下没有使用索引的query

第二步:查看关于慢查询的状态

方式二:通过MySQL数据库开启慢查询

上文的配置需要重启mysql server进程mysqld才会生效。但是很多时候,尤其是产品运营环境,不希望每次修改都需要重新启动mysql服务器,也希望能在某些特定时间记 录。MySQL5.1给我们提供了更为灵活的运行时控制,使得你不必重新启动mysql服务器,也能选择性地记录或者不记录某些slow queries。

MySQL5.1中,提供了全局变量slow_query_log、slow_query_log_file可以灵活地控制enable/disable慢查询。同时可以通过long_query_time设置时间

#//启用slow query记录

#注意:设置了slow_query_log全局变量, log_slow_queries也会隐性地跟着改变

mysql>set global slow_query_log=ON

不幸运的是,在MySQL5.0并没有提供类似的全局变量来灵活控制,但是我们可以通过将long_query_time设置得足够大来避免记录某些查询语句。比如

mysql>set global long_query_time = 3600;

mysql>set global log_querise_not_using_indexes = ON;

MySQL5.0, 不关服务的情况下,希望不记录日志的办法是将日志文件成为/dev/null的符号链接(symbolic link)。注意:你只需要在改变后运行FLUSH LOGS以确定MYSQL释放当前的日志文件描述符,重新把日志记录到/dev/null

和MySQL5.0不同,MySQL5.1可以在运行时改变日记行为,将日志记录到数据库表中。只要将mysql全局变量log_output设置为 TABLE即可。MySQL会将日志分别记录到表mysql.gengera_log和mysql.slow_log二张表中。但是,我们推荐将日志记录 在日记文件中。

mysql> show variables like ‘log_output'\G

Variable_name: log_output

Value: FILE

mysql>set global log_output='table';

缺陷与审记

虽然记录了slow query能够帮助你优化产品。但是MySQL目前版本,还有几大蹩足的地方。

1.MySQL5.0版本, long_query_time时间粒度不够细,最小值为1秒。对于高并发性能的网页脚本而言,1秒出现的意义不大。即出现1秒的查询比较少。直到mysql5.1.21才提供更细粒度的long_query_time设定.

2.不能将服务器执行的所有查询记录到慢速日志中。虽然MySQL普通日志记录了所有查询,但是它们是解析查询之前就记录下来了。这意味着普通日志没办法包含诸如执行时间,锁表时间,检查行数等信息。

3.如果开启了log_queries_not_using_indexes选项,slow query日志会充满过多的垃圾日志记录,这些快且高效的全表扫描查询(表小)会冲掉真正有用的slow queries记录。比如select * from category这样的查询也会被记录下来。

通过microslow-patch补丁可使用更细的时间粒度,和记录所有执行过的sql语句。不过,使用这个补订不得不自己编译MySQL,出于稳定性考滤,我们推荐在开发测试环境,可以打上这个补丁,享受这个补丁带来的便利。在运营环境尽量不要这么做…

第二步.验证慢查询是否开启

执行如下SQL语句来查看mysql慢查询的状态

执行结果会把是否开启慢查询、慢查询的秒数、慢查询日志等信息打印在屏幕上。

/*查看慢查询时间 */

show variables like "long_query_time";默认10s

/*查看慢查询配置情况 */

show status like "%slow_queries%";

/*查看慢查询日志路径 */

show variables like "%slow%";

第三步:执行一次慢查询操作

其实想要执行一次有实际意义的慢查询比较困难,因为在自己测试的时候,就算查询有20万条数据的海量表,也只需要0.几秒。我们可以通过如下语句代替:

SELECT SLEEP(10);

第四步:查看慢查询的数量

通过如下sql语句,来查看一共执行过几次慢查询:

show global status like '%slow%';

mysql日志的配置:

注意:这些日文件在mysql重启的时候才会生成

#记录所有sql语句

log=E:/mysqllog/mysql.log

#记录数据库启动关闭信息,以及运行过程中产生的错误信息

log-error=E:/mysqllog/myerror.log

# 记录除select语句之外的所有sql语句到日志中,可以用来恢复数据文件

log-bin=E:/mysqllog/bin

#记录查询慢的sql语句

log-slow-queries=E:/mysqllog/slow.log

#慢查询时间

long_query_time=2

第四步:分析慢查询日志

方式一:通过工具分析

MySQL自带了mysqldumpslow工具用来分析slow query日志,除此之外,还有一些好用的开源工具。比如MyProfi(下载地址:http://sourceforge.net/projects/myprofi/)、mysql-log-filter,当然还有mysqlsla

以下是mysqldumpslow常用参数说明,详细的可应用mysqldumpslow -help查询。

-s,是表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序(从大到小),ac、at、al、ar表示相应的倒叙。

-t,是top n的意思,即为返回前面多少条数据。

-g,后边可以写一个正则匹配模式,大小写不敏感。

接下来就是用mysql自带的慢查询工具mysqldumpslow分析了(mysql的bin目录下),我这里的日志文件名字是host-slow.log。

列出记录次数最多的10个sql语句

mysqldumpslow -s c -t 10 host-slow.log

列出返回记录集最多的10个sql语句

mysqldumpslow -s r -t 10 host-slow.log

按照时间返回前10条里面含有左连接的sql语句

mysqldumpslow -s t -t 10 -g "left join" host-slow.log

使用mysqldumpslow命令可以非常明确的得到各种我们需要的查询语句,对MySQL查询语句的监控、分析、优化起到非常大的帮助。

方式二:直接分析mysql慢查询日志

日志部分内容如下:

# Time: 121017 17:38:54

# User@Host: root[root] @ localhost [127.0.0.1]

# Query_time: 3.794217 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 4194304

SET timestamp=1350466734;

select * from wei where text='orange';

# Time: 121017 17:46:22

# User@Host: root[root] @ localhost [127.0.0.1]

# Query_time: 3.819219 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 4194304

SET timestamp=1350467182;

select * from wei where text='xishizhaohua';

其实定位到了慢查询语句就已经完成了一大不了,执行explain或者desc命令查看慢查询语句,如下图:

be651cb390cee5fa02af428c9e2c0e0f.png

问题很明显,解决方式也很明显,建索引了。

mysql> create index text_index on wei(text);

Query OK, 4194304 rows affected (1 min 58.07 sec)

Records: 4194304 Duplicates: 0 Warnings: 0

然后在执行查询操作,用时明显少了很多。

mysql> select * from wei where text='orange';

+---------+--------+

| id | text |

+---------+--------+

| 4103519 | orange |

+---------+--------+

1 row in set (0.33 sec)

Slow Query日志,虽然帮助你记录了那些执行过了的SQL语句。但它不是万能的,意义可能没有你想象的那么大。它只告诉了你哪些语句慢,但是为什么慢?具体 原因,还是需要你自己去分析,不断的调试。也许,你只需要换一条更有效的sql语句,也许你只需简单地增加一个索引,但也有可能你需要调整你应用程序的设 计方案。比如,上面那条语句是很明显,它检查了600多万行数据。不幸的是,并不是每条语句都这么明显。也许还有别的原因,比如:

*锁表了,导致查询处于等态状态。lock_time显示了查询等待锁被翻译的时间

*数据或索引没有被缓存。常见于第一次启动服务器或者服务器没有调优

*备份数据库,I/O变慢

*也许同时运行了其它的查询,减少了当前查询

所以,不要过于紧张日志文件某条记录,而应该理性地审记,找出真正的原因。如果经常出现的slow query需要特别注意。如果个别出现,则做一些常规检查即可。我们建议,统计并且形成基准报告,进行比较排除,比胡乱瞎撞有用。希望大家不要在这部分过于浪费时间与精力。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

您可能感兴趣的文章:解决MySQl查询不区分大小写的方法讲解

Mysql优化策略(推荐)

详解MySQL是如何解决幻读的

详解使用navicat连接远程linux mysql数据库出现10061未知故障

详解mysql数据库增删改操作

使用shell脚本来给mysql加索引的方法

MySQL字符集乱码及解决方案分享

MySQL执行update语句和原数据相同会再次执行吗

Mysql查询很慢卡在sending data的原因及解决思路讲解

想取消错误的mysql命令怎么办?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STL10-deque容器

deque 双端队列 deque 删除操作 deque案例&#xff1a; #if 1 #include<iostream> #include<deque> using namespace std; void PrintDeque(deque<int>& d) {for (deque<int>::iterator it d.begin(); it ! d.end(); it) {cout << *it <…

php mysql 平均分_平均评级计算mysql php

我想计算每个用户的平均评分 .我有三张 table .表评级id |order_id |rate------------------1 | 52 |82 | 51 |43 | 52 |24 | 51 |7表顺序这里做的是驱动程序表IDid |did------------------52 | 551 | 735 | 644 | 8表驱动程序id |name------------------5 | test17 | test28 |…

Leedcode4-sort listnode 归并排序

#include<iostream> using namespace std;//Sort a linked list in O(n log n) time using constant space complexity.//Definition for singly-linked list. //归并排序 #if 0 struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}}; str…

vue 字典配置_vue遍历数据及字典的方法

数组&#xff1a;数值{{ item.message }}数组&#xff1a;数值加索引{{ item.msg }}{{index}}字典&#xff1a;key value index{{ value }} {{key}} {{index}}new Vue({el: #repeat,data: {object: {FirstName: John,LastName: Doe,Age: 30}}})vue遍历数组和对象的方法以及他们…

tensorflow代码中tf.app.run()什么意思

# 前面的代码省略了... 。。。 。。。 。。。 def main(argvNone):mnist input_data.read_data_sets("F:\mydata\TensorFlowData\MNIST_data", one_hotTrue)train(mnist)if __name__ __main__:tf.app.run()那么 tf.app.run()什么意思呢 &#xff1f;可以猜到&#…

java jdbc dao_Java自学-JDBC DAO

基于JDBC设计DAO的实例DAODataAccess Object数据访问对象实际上就是运用了ORM中的思路&#xff0c;把数据库相关的操作都封装在这个类里面&#xff0c;其他地方看不到JDBC的代码步骤 1 : DAO接口package jdbc;import java.util.List;import charactor.Hero;public interface DA…

java 井字棋 人机_一个井字棋tictactoe游戏的java实现 | Soo Smart!

这是一个井字棋游戏的java实现。摘录于stackoverflow。游戏规则很简单&#xff0c;只要一方棋子在水平线&#xff0c;垂直线或者对角线任意一条线上排列成功即为获胜。作者原先的代码存在着一些问题&#xff1a;代码如下&#xff1a;一共有几个类: play, player, human, comput…

C++随机数(rand和srand)函数用法详解

C 提供了一组函数以生成和使用随机数字。随机数字就是从一组可能的值中进行随机选择而获得的一个值。该组中的值都有相同的被选中的几率。 随机数字常用于许多不同类型的程序中&#xff0c;以下是一些示例&#xff1a; 计算机游戏通常要使用随机数字来模拟一些随机过程&#x…

STL11-stack容器

#if 1 #include<iostream> #include<stack> using namespace std;void test01() {//初始化stack<int> s1;stack<int> s2(s1);//stack操作s1.push(10);s1.push(20);s1.push(30);s1.push(40);cout << "栈顶元素&#xff1a;" << e…

java犀牛是什么意思_深入浅出Rhino:Java与JS互操作

2011年10月6日&#xff0c;一年一度的JavaOne大会隆重举行。JavaOne2011大会的主题之一介绍针对不同Java平台的产品路线图&#xff0c;这其中包括移动版(ME&#xff0c;Micro Edition)、标准版(SE&#xff0c;Standard Edition)以及企业版(EE&#xff0c;Enterprise Edition)。…

STL12-queue容器

queue容器 队列容器 先进先出 队列只能在一端插入 一端删除 队列不能遍历 不提供迭代器 不支持随机访问 #if 1 #include<iostream> #include<queue> using namespace std; void test01() {queue<int> q; //创建队列queue<int> q2(q);q.push(10);q.pu…

java读取csv合适文件_解析-您可以推荐一个Java库来读取(并可能写入)CSV文件吗?...

Super CSV是读取/解析&#xff0c;验证和映射CSV文件到POJO的绝佳选择&#xff01;我们(Super CSV团队)刚刚发布了一个新版本(您可以从SourceForge或Maven下载它)。读取CSV文件以下示例使用read()(我们刚刚发布的新阅读器&#xff0c;使用Dozer进行具有深度映射和基于索引的映射…

Leedcode6-binary-tree-preorder-traversal

#include<iostream> #include<vector> #include<stack> using namespace std; // Definition for binary tree 先序遍历 根左右 struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; #if 0 c…

java 对list增删_List 中正确的增删操作

这个为什么要单独说的原因是&#xff0c;在开发中的对数据库中的增删为最基本的&#xff0c;但是是不是写对了就尤为重要先来看代码:1 public voidtestLoopInList(){2 List a new ArrayList();3 a.add("1");4 a.add("2");5 a.add("w");6 for(St…

Leedcode7-binary-tree-postorder-traversal

#include<iostream> #include<vector> #include<stack> using namespace std; // Definition for binary tree 先序遍历 根左右 struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; #if 0 c…

mysql zrm_mysql数据库备份—ZRM

ZRM是Zmanda Recovery Manager的缩写&#xff0c;这是一款备份mysql的开源软件。一、安装#yum install -y MySQL-zrm二、创建备用用户#mysql -uroot -pmysql>grant select,insert,update,create,drop,reload,shutdown,alter,super,lock table,replication client on *.* …

用tensorflow搭建RNN(LSTM)进行MNIST 手写数字辨识

用tensorflow搭建RNN(LSTM)进行MNIST 手写数字辨识 循环神经网络RNN相比传统的神经网络在处理序列化数据时更有优势&#xff0c;因为RNN能够将加入上&#xff08;下&#xff09;文信息进行考虑。一个简单的RNN如下图所示&#xff1a; 将这个循环展开得到下图&#xff1a; 上一…

java gzip rest_RestTemplate与Gzip压缩

Gzip 是一种压缩算法&#xff0c;服务器经常通过这个算法来压缩响应体&#xff0c;再响应给客户端&#xff0c;从而减少数据体积&#xff0c;提高传输速度。客户端再通过Gzip解压缩&#xff0c;获取到原始的数据。因为需要压缩计算&#xff0c;所以会耗费额外的CPU资源。Gzip 与…

RNN入门

雷锋网 AI科技评论按&#xff1a;本文作者何之源&#xff0c;原文载于知乎专栏AI Insight&#xff0c;雷锋网(公众号&#xff1a;雷锋网) AI科技评论获其授权发布。 上周写的文章《完全图解RNN、RNN变体、Seq2Seq、Attention机制》介绍了一下RNN的几种结构&#xff0c;今天就来…

Java二进制小数表示_《Java编程的逻辑》笔记9--小数的二进制表示

小数计算为什么会出错&#xff1f;简要答案实际上&#xff0c;不是运算本身会出错&#xff0c;而是计算机根本就不能精确的表示很多数&#xff0c;比如0.1这个数。计算机是用一种二进制格式存储小数的&#xff0c;这个二进制格式不能精确表示0.1&#xff0c;它只能表示一个非常…