【发布时间】:2015-09-25 10:29:35
【问题描述】:
我的 SQL 查询有问题,由于原因(我不明白),根据“strace”a(超时)并且会起床运行 X 次?
poll([{fd=6, events=POLLIN|POLLPRI}], 1, 0) = 0(超时)
执行查询的 PHP 脚本首先在数据库中查找相应的电子邮件地址是否已在数据库中,如果没有,则将其添加,如果没有发生错误,则发送电子邮件。
服务器: Ubuntu 14.04.3 LTS
数据库: mysql Ver 14.14 Distrib 5.5.44,适用于使用 readline 6.3 的 debian-linux-gnu (x86_64)
表: InnoDB
SQL:(示例 | 1 个查询的持续时间:0,031 秒。)
SELECT SQL_NO_CACHE user_email FROM mail_logging
WHERE mail_id_fk IN (142)
AND user_email = 'tester@foo.bar'
SQL:(解释)
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE mail_logging ref id_mail,mail_id_fk,user_email id_mail 775 const,const 1 使用 where;使用索引strace: http://pastebin.com/FbYUZ1a3
lsof: http://pastebin.com/RyQcbWmj
编辑:感谢@VolkerK,现在我看到了问题:P
【问题讨论】:
-
a) 电子邮件字段上的唯一索引使用 SELECT-if-nothing-found-INSERT 组合解决了问题,而不会出现可能的竞争条件。只需检查 errno 1022 ER_DUP_KEY b) 您能否将
EXPLAIN SELECT SQL_NO_CACHE user_email FROM mail_logging WHERE mail_id_fk IN (142) AND user_email = 'tester@foo.bar'的结果添加到您的问题文本中? -
@VolkerK 所说的是您问题的真正解决方案。如果你能避免在 PHP 中检查完整性,你根本不会遇到超时问题。
-
根据日志
poll(..., ..., int timeout)已被调用,超时为0,即它应该立即返回报告状态和timeout(如果我没记错的话)在这种情况下只是意思是“没有报告”。所以,目前,我什至没有在这里看到timeout problem;-)