锁定表上的 INSERT DELAYED 会阻止 PHP 进程继续

锁定表上的 INSERT DELAYED 会阻止 PHP 进程继续

我们的网络服务器将一些跟踪信息写入 MySQL 数据库(使用 INSERT DELAYED 插入 MyISAM 表)。当在此表上执行大量 SELECT 查询或由于其他原因将其锁定时,网络服务器进程(使用 INSERT DELAYED)正在等待数据库,在某些情况下,Apache 中已达到 MaxServer 限制,因此它们将停止处理请求。

我们使用 INSERT DELAYED 是因为

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

引自MySQL 文档

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

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

答案1

在我看来,你正在做正确的事情来得到你想要的东西,你所描述的就是它应该发挥作用的方式。想法:

  • 检查您的 MySQL 线程数——MySQL 是否耗尽了线程并因此阻塞了 PHP/Apache 进程?
  • 您在 PHP 中使用 mysql_pconnect() 吗?我不确定持久连接是如何处理的,但如果它以某种方式被长选择阻塞,则可能会干扰插入。

相关内容