MySQL 慢查询排查

先简略写写,有时间做详细描述。

查询慢 SQL

查询慢 SQL:

1
select id, db, user, host, command, time, state, info  FROM information_schema.processlist WHERE command!="Sleep" order by time desc;

如果使用了【双主、主从】之类的同步,忽略前三个最长时间的 process,那是同步用的。

其他两个实用的命令:

1
/mysql/service/mysql-5.7.28/bin/mysql -u root -p'root$123' -e'select id, db, user, host, command, time, state, info  FROM information_schema.processlist WHERE command!="Sleep" order by time desc\G' > /tmp/20200923-SlowQuery.txt
1
select concat('kill ', id, ';')  from information_schema.processlist where command != 'Sleep' and time > 10*60 and user='gzsz' order by time desc;

其他

1、查询是否锁表 show OPEN TABLES where In_use > 0;

2、查询进程 show processlist 查询到相对应的进程===然后 kill id

补充: 查看正在锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

查看等待锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

SELECT * from information_schema.INNODB_TRX kill trx_mysql_thread_id

可直接在mysql命令行执行:show engine innodb status\G;(只能通过cmd或者shell登录mysql)

查看造成死锁的sql语句,分析索引情况,然后优化sql然后show processlist; show status like ‘%lock%’ show OPEN TABLES where In_use > 0; 这个语句记录当前锁表状态 另外可以打开慢查询日志,linux下打开需在my.cnf的[mysqld]里面加上以下内容:

slow_query_log=TRUE(有些mysql版本是ON)

slow_query_log_file=/usr/local/mysql/slow_query_log.txt

long_query_time=3

Windows:

在my.ini配置文件的[mysqld]选项下增加:

slow_query_log=TRUE

slow_query_log_file=c:/slow_query_log.txt

long_query_time=3

添加完成之后记得一定要重启mysql服务才能生效记录输出。微笑最后在MySQL客户端中输入命令:

show variables like '%quer%'; 核查一哈是否Ok

加载评论