2015-09-25 55 views
1

我有一个SQL查询的问题,出于某些原因(我不明白),根据“strace”(超时),并将启动运行X-times?什么意思(超时)在“strace” - 输出? (mysql/php分析)

轮询([{FD = 6,事件= POLLIN | POLLPRI}],1,0)= 0(超时)

PHP脚本,其首先执行查询看起来在数据库中,如果相应的电子邮件地址已存在于数据库中,如果没有,则会将其添加,如果没有发生错误,则会发送一封电子邮件。

服务器: Ubuntu的14.04.3 LTS

DB: MySQL的版本14.14 DISTRIB 44年5月5日,对于使用的readline 6.3

表Debian的Linux-GNU(x86_64的): InnoDB的

SQL:(实施例| 1查询的持续时间:0031秒)

SELECT SQL_NO_CACHE user_email FROM mail_logging 
WHERE mail_id_fk IN (142) 
AND user_email = '[email protected]' 

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 Using where; Using index 

strace的:http://pastebin.com/FbYUZ1a3

lsof的:http://pastebin.com/RyQcbWmj

编辑:谢谢@VolkerK,现在我看到这个问题:P

+2

a)电子邮件字段上的唯一索引使用SELECT-NOT-nothing-found-INSERT组合来解决没有可能的竞争条件的问题。只需检查errno [1022 ER_DUP_KEY](https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html#error_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

+0

@VolkerK说的是真正解决您的问题的方法。如果您可以避免检查PHP中的完整性,则根本不会有超时问题。 – Mjh

+1

根据日志'poll(...,...,int timeout)'调用了超时值0,即它应该立即返回状态报告和超时值(如果我没有弄错)在这种情况下仅仅意味着“无需报告”。所以,目前,我甚至在这里看不到“超时问题”;-) – VolkerK

回答

2

我认为这是轮询呼叫以超时结束。从投票手册页:

timeout参数指定poll()将阻塞的最小毫秒数。 (此间隔将四舍五入到系统时钟粒度,并且内核调度延迟表示阻塞间隔可能会超出一小部分。)在超时中指定负值意味着无限超时。指定超时值会导致poll()立即返回,即使没有文件描述符准备就绪