• 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 曾经处置责罚完了一切待处置责罚的拔出操作,正在期待新的哀告。

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

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




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

  • 相关阅读:
    expect script
    2011年11月28日,29日学习内容总结
    2011年11月27日学习内容总结
    Toad使用(转)
    2011年11月30日学习总结
    2011年11月24日学习内容总结
    2010年11月23日学习内容总结
    Toad Can't initialize OCI. Error 1解决办法
    2011年11月25日学习内容总结
    2011年12月1日学习内容总结
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1974365.html
Copyright © 2020-2023  润新知