mysql服务器查询慢原因分析方法

美高梅官方网站,在实际项目开发中,如果我们对数据库的压力比较大,比如有大批量的查询或者插入等sql,尤其是多线程插入等情况,针对部分执行比较慢的sql,我们可以将其kill掉,常用的一个命令就是show processlist

MySQL数据库在查询的时候会出现查询结果很慢,超过1秒,项目中需要找出执行慢的sql进行优化,应该怎么找呢,mysql数据库提供了一个很好的方法,如下: 
mysql5.0以上的版本可以支持将执行比较慢的SQL语句记录下来。 
1.需要使用打开记录查询慢的sql记录日志:

1. show processlist是什么

查看慢查询时间
show variables like 'slow%';
查看设置多久是慢查询
show variables like 'long%';
修改慢查询时间
set long_query_time=1;
打开慢查询记录日志
set global slow_query_log='ON';

show processlist:通过查看mysql的官网,可以发现,其主要是查询数据库中哪些线程正在执行,针对比较慢的线程我们可以将其kill掉。此外,show full processlist 返回的结果是实时变化的。

美高梅官方网站 1
2.进入到log_file的目录下即可查询哪些sql执行慢了。 
3.然后就是进行优化执行慢的sql,加索引、修改查询方式等 
4.另外比较有用的命令:

2. show processlist怎么用

查看哪些线程正在运行
show full processlist
查看最大连接数
show variables like '%max_connections%';
当前连接数
show status like 'Threads_connected%';

有三种方式可以执行show processlist,可以通过命令行、SQL语句、Navicat客户端等。

http://blog.csdn.net/lu_wei_wei/article/details/51242795

1) 命令行:SHOW FULL PROCESSLISTG

在使用mysql运行某些语句时,会因数据量太大而导致死锁,没有反映。这个时候,就需要kill掉某个正在消耗资源的query语句即可, KILL命令的语法格式如下:

mysql> SHOW FULL PROCESSLISTG*************************** 1. row ***************************Id: 1User: system userHost:db: NULLCommand: ConnectTime: 1030455State: Waiting for master to send eventInfo: NULL*************************** 2. row ***************************Id: 2User: system userHost:db: NULLCommand: ConnectTime: 1004State: Has read all relay log; waiting for the slave I/O thread to update itInfo: NULL*************************** 3. row ***************************Id: 3112User: replikatorHost: artemis:2204db: NULLCommand: Binlog DumpTime: 2144State: Has sent all binlog to slave; waiting for binlog to be updatedInfo: NULL*************************** 4. row ***************************Id: 3113User: replikatorHost: iconnect2:45781db: NULLCommand: Binlog DumpTime: 2086State: Has sent all binlog to slave; waiting for binlog to be updatedInfo: NULL*************************** 5. row ***************************Id: 3123User: stefanHost: localhostdb: apollonCommand: QueryTime: 0State: NULLInfo: SHOW FULL PROCESSLISTrows in set  可以通过sql语句查询数据库中相关信息的表 select id, db, user, host, command, time, state, info from information_schema.processlist order by time desc 3) 可以通过Navicat工具查看,如下图是使用Navicat查询到的截图。 3. show processlist怎么解读 下面对于使用该命令查询到的结果进行解读。 Id:链接mysql 服务器线程的唯一标识,可以通过kill来终止此线程的链接。 User:当前线程链接数据库的用户 Host:显示这个语句是从哪个ip 的哪个端口上发出的。可用来追踪出问题语句的用户 db: 线程链接的数据库,如果没有则为null Command: 显示当前连接的执行的命令,一般就是休眠或空闲,连接 Time: 线程处在当前状态的时间,单位是秒 State:显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态的描述,请注意,state只是语句执行中的某一个状态,一个 sql语句,已查询为例,可能需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成 Info: 线程执行的sql语句,如果没有语句执行则为null。这个语句可以使客户端发来的执行语句也可以是内部执行的语句 4. show processlist结果怎么处理 在上面的步骤中,我们可以查到每个线程的执行时间等信息,因此针对执行时间比较长的线程,我们可以直接将其kill掉,直接执行 kill Id号即可。 如果要查时间超过5分钟的,可以拼接并执行以下sqlselect concat from information_schema.processlist where command != 'Sleep' and time > 5*60 order by time desc

KILL [CONNECTION | QUERY] thread_id

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW PROCESSLIST语句查看哪些线程正在运行,并使用KILL thread_id语句终止一个线程。

本文由美高梅官方网站发布于数据统计,转载请注明出处:mysql服务器查询慢原因分析方法

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。