MySQL数据库中查找执行从命慢的SQL语句



来历:赛迪网    作者:Alizze

启动Mysql时加参数--log-slow-queries来记载执行时间跨越long_query_time秒的sql:

/usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql 
--user=mysql --pid-file=/var/run/mysqld/mysqld.pid 
--skip-locking --port=3306 --socket=/var/run/mysqld/mysqld.sock --log-slow-
queries=/var/log/mysql/slow.log

explain来年夜白SQL执行的形状。

explain select * from wp_posts\G;

运用show status like "Handler_read%"; 来年夜白索引的了局。

Handler_read_key 值高示意索引了局好,Handler_read_rnd_next值高示意索引低效。

用show processlist 审查今后运转形状。

mysql> show processlist;

----- ------------- --------------------

| Id | User | Host | db | Command | Time| State | Info

----- ------------- --------------------

|207|root |192.168.0.20:51718 |mytest | Sleep | 5 | | NULL

|208|root |192.168.0.20:51719 |mytest | Sleep | 5 | | NULL

|220|root |192.168.0.20:51731 |mytest |Query | 84 | Locked |

select bookname,culture,value,type from book where id=001

先重年夜说一下各列的寄义和用处,第一列,id,不必说了吧,一个标识,你要kill一个语句的时分很有效。user列,显示单前用户,如果不是root,这个号令就只显示你权限范围内的sql语句。host列,显示这个语句是从哪个ip的哪个端口上发出的。呵呵,可以用来追踪出成果语句的用户。db列,显示这个历程目前跟尾的是哪个数据库。command列,显示今后跟尾的执行的号令,一样往常即是休眠(sleep),盘诘(query),跟尾(connect)。time列,此这个形状继续的时间,单位是秒。state列,显示运用今后跟尾的sql语句的形状,很主要的列,后续会有一切的形状的描摹,请当心,state只是语句执行中的某一个形状,一个sql语句,已盘诘为例,能够需求经过copying to tmp table,Sorting result,Sending data等形状才可以完成,info列,显示这个sql语句,由于长度无限,以是长的sql语句就显示不全,可是一个鉴定成果语句的主要按照。

这个号令中最要害的即是state列,mysql列出的形状主要有以下几种:

Checking table

正在搜检数据表(这是主动的)。

Closing tables

正在将表中修正的数据改革到磁盘中,同时正在封闭曾经用完的表。这是一个很快的操作,如果不是如许的话,就应该确认磁盘空间可否曾经满了梗概磁盘可否正处于重负中。

Connect Out

复制从效力器正在跟尾主效力器。

Copying to tmp table on disk

由于且自了局集年夜于 tmp_table_size,正在将且自表从内存存储转为磁盘存储以此糜掷内存。

Creating tmp table

正在竖立且自表以存放部分盘诘了局。

deleting from main table

效力器正在执行多表删除中的第一部分,刚删除第一个表。

deleting from reference tables

效力器正在执行多表删除中的第二部分,正在删除其他表的记载。

Flushing tables

正在执行 FLUSH TABLES,期待其他线程封闭数据表。

Killed

发送了一个kill哀告给某线程,那么这个线程将会搜检kill标记位,同时会抛却下一个kill哀告。MySQL会在每次的主循环中搜检kill标记位,不过有些情形下该线程能够会过一小段才调归天失。如果该线程程被其他线程锁住了,那么kill哀告会在锁释放时立即生效。

Locked

被其他盘诘锁住了。

Sending data

正在处置责罚 SELECT 盘诘的记载,同时正在把了局发送给客户端。

Sorting for group

正在为 GROUP BY 做排序。

Sorting for order

正在为 ORDER BY 做排序。

Opening tables

这个历程应该会很快,除非遭到其他成分的滋扰。比方,在执 ALTER TABLE 或 LOCK TABLE 语句行完早年,数据表无法被其他线程掀开。 正测验测验掀开一个表。

Removing duplicates

正在执行一个 SELECT DISTINCT 方式的盘诘,可是MySQL无法在前一个阶段优化失那些几次的记载。因此,MySQL需求再次去失几次的记载,然后再把了局发送给客户端。

Reopen table

取得了对一个表的锁,可是必需在表布局修正之后才调取得这个锁。曾经释放锁,封闭数据表,正测验测验从新掀开数据表。

Repair by sorting

修复指令阃在排序以竖立索引。

Repair with keycache

修复指令阃在行使索引缓存一个一个地竖立新索引。它会比 Repair by sorting 慢些。

Searching rows for update

正在讲切合条件的记载找出来以备更新。它必需在 UPDATE 要修正相干的记载之前就完成了。

Sleeping

正在期待客户端发送新哀告.

System lock

正在期待取得一个内部的系统锁。若因今后没有运转多个 mysqld 效力器同时哀告统一个表,那么可以经由增长 --skip-external-locking参数来停止内部系统锁。

Upgrading lock

INSERT DELAYED 正在测验测验取得一个锁表以拔出新记载。

Updating

正在搜索婚配的记载,并且修正它们。

User Lock

正在期待 GET_LOCK()。

Waiting for tables

该线程得到报告,数据表布局曾经被修正了,需求从新掀开数据表以取得新的布局。然后,为了能的从新掀开数据表,必需比及一切其他线程封闭这个表。以下几种情形下会产生这个报告:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, 或 OPTIMIZE TABLE。

waiting for handler insert

INSERT DELAYED 曾经处置责罚完了一切待处置责罚的拔出操作,正在期待新的哀告。

年夜部分形状对应很快的操作,只需有一个线程对峙统一个形状好几秒钟,那么能够是有成果发生了,需求搜检一下。

另有别的的形状没在上面中列出来,不过它们年夜部分只是在审查效力器可否有存在错误是才用得着。




版权声明: 原创作品,许愿转载,转载时请务必以超链接方式标明文章 原始出处 、作者信息和本声明。否则将深究法律责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1974365.html