在locking的表上插入DELAYED会阻止PHP进程继续

我们的Web服务器将一些跟踪信息写入MySQL数据库(使用INSERT DELAYED到MyISAM表中)。 当在这个表上执行一个巨大的SELECT查询或者由于其他原因而被locking时,Web服务器进程(使用INSERT DELAYED)正在等待数据库,并且在某些情况下MaxPlanet的限制在Apaches中到达,所以它们将停止服务请求。

我们使用INSERT DELAYED,因为

INSERT语句的DELAYED选项是对标准SQL的MySQL扩展,如果您的客户端不能或不需要等待INSERT完成,那么它非常有用。 当您使用MySQL进行日志logging时,这是一种常见的情况,并且您还会定期运行需要很长时间才能完成的SELECT和UPDATE语句。

从MySQL文档引用。

我想知道为什么Apache进程正在等待INSERT DELAYED完成。 我可以做些什么来发送数据,并忘记它。 (因为这是日志logging数据,我不在乎是否丢失了一些条目。)即使表被locking,PHP脚本也应该继续,不应该等待MySQL的回答。

(我们不想为这个表设置主从,但是我们正在考虑将这些数据移到一些NoSQL数据库,但是现在我想知道为什么INSERT DELAYED没有按预期工作。)

这听起来像你正在做正确的事情来得到你想要的,而你所描述的是它应该工作的方式。 思考:

  • 检查你的MySQL线程数量 – MySQL是用尽线程,因此阻止PHP / Apache进程?
  • 你在PHP中使用mysql_pconnect()吗? 我不确定持久连接是如何处理的,但是如果长时间select被阻塞,可能会干扰插入。