2011-11-20 59 views
0

在MySQL进程列表中,它显示了几个SELECT查询已被锁定。的锁定节目超过4000MySQL进程列表 - 锁定问题

| 24 | user | localhost | database | Query | 4725 | Locked | SELECT * FROM data 
| 25 | user | localhost | database | Query | 4725 | Locked | SELECT * FROM data 
| 26 | user | localhost | database | Query | 4725 | Locked | SELECT * FROM data 

PHP脚本的时间已经执行过一段时间,但随后在SELECT锁定状态成了。如何解决这个问题呢?

$SQL = "SELECT * FROM data"; 
$query = $db->prepare($SQL); 
$query->execute(); 
while ($row = $query->fetch(PDO::FETCH_ASSOC)) { 
    //Do something 
    sleep(2); 
} 

是否mySQL服务器限制SELECT查询在一次运行一次?这可以改变吗?

回答

2

您应该运行show engine innodb status \G来查看持有该锁的查询。

经过讨论,在评论和听证会上,MyISAM正在使用中,并且有很多写道,我建议你转到InnoDB。

InnoDB一直是默认引擎一段时间,通常更好。在这种情况下,您将获得基于行的锁定。 InnoDB也正在开发比MyISAM更多的功能。

+0

我正在使用MyISAM –

+0

哦,我已经忘记了关于myisam的所有信息:( –

+0

MyISAM锁定了整个表,当它写入并且没有读取可以完成,直到该锁被释放。在写入之前被执行,等等,但在你的情况下,它看起来好像有一个写入阻止你的读取。 –

0

如果您的进程列表中只有选择语句,这可能是由服务器上可用资源有限造成的。如果出现这种情况,可以尝试优化可能运行的查询,或尝试在服务器上实现某种缓存,从而避免此问题。您也可以降低max_connections系统变量,但这可能不是一个可行的解决方案。

0

你的桌子有多大?

INNODB不是魔术。有关系统的一些信息可以提供帮助。

+0

超过140,000行...首先使用'SELECT'查询,然后做一个LO t'UPDATE'。服务器规格是:英特尔酷睿2四核Q8300,4GB,Linux。 MySQL服务器CPU 100%高 –

+0

SELECT * FROM 140K rows?我可以理解为什么它缓慢而沉重。 –

+0

另外,你的MySQL版本是什么? –