MySQL进程列表锁定问题


MySQL Process List - locked issue

在MySQL进程列表中,它显示一些SELECT查询已被锁定。锁定显示时间超过4000

|   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查询一次只能运行一次?这能改变吗?

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

在评论中讨论了这个问题,听到MyISAM正在使用,并且有很多写入,我建议你转移到InnoDB。

InnoDB作为默认引擎已经有一段时间了,通常情况下要好一些。在这种情况下,您将获得基于行的锁定。InnoDB的开发也比MyISAM多。

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

你的表有多大?

INNODB不是魔法。一些关于系统的信息可能会有所帮助。