mysql sending data状态时间花费太大

本文介绍了一条MySQL查询语句在发送数据阶段耗时过长的原因及优化方法,并讨论了表锁争用现象及其可能的解决方案。

select * from searchzh where modified_date > '2009-09-02 14:45:22';

一条mysql查询语句的性能:sending data 耗时10分钟。。。。

+--------------------------------+-----------+ 
| Status | Duration | 
+--------------------------------+-----------+ 
| (initialization) | 0.000006 | 
| checking query cache for query | 0.000025 | 
| checking permissions | 0.000008 | 
| Opening tables | 0.000148 | 
| System lock | 0.000008 | 
| Table lock | 0.000008 | 
| init | 0.000007 | 
| checking permissions | 0.000045 | 
| optimizing | 0.000016 | 
| statistics | 0.00027 | 
| preparing | 0.000034 | 
| executing | 0.000005 | 
| Sending data | 614.25387 | 
| end | 0.000046 | 
| query end | 0.000012 | 
| freeing items | 0.000017 | 
| closing tables | 0.000008 | 
| logging slow query | 0.000054 | 
+--------------------------------+-----------+ 
18 rows in set (0.01 sec)

产生的原因:

searchzh视图相关的表,update,insert,delete操作频繁。在mysql的表锁定机制中,select语句的优先级比update低。所以此select语句一直在锁队列中等待,后来的update操作会插队到select语句前面。导致| Sending data | 614.25387 |

解决方法有多种,最简单的

select HIGH_PRIORITY * from searchzh where modified_date > '2009-09-02 14:45:22';

指定该select语句具有高优先级。

=======================================

mysql15:21:30> SHOW STATUS LIKE 'Table%'; 
+-----------------------+-----------+ 
| Variable_name | Value | 
+-----------------------+-----------+ 
| Table_locks_immediate | 120977304 | 
| Table_locks_waited | 577 | 
+-----------------------+-----------+

表锁争用现象比较严重。

在频繁更新和查询的情景下,使用innodb也许更好。

转载


本文转自    geekwolf   51CTO博客,原文链接:http://blog.51cto.com/linuxgeek/995243

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值