2013-04-11 33 views
1

我在Innodb表中有一个奇怪的问题与SELECT,它永远不会返回,我等了两个多小时,看看我得到的结果,但没有,仍在等待。MySql Innodb表奇怪的选择锁定/超时

CREATE TABLE `example` (
    `id` int(11) NOT NULL, 
    `done` tinyint(2) NOT NULL DEFAULT '0', 
    `agent` tinyint(4) NOT NULL DEFAULT '0', 
    `text` varchar(256) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `da_idx` (`done`,`agent`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 | 

,我无法得到结果的查询是:

SELECT id, text FROM example WHERE done = 0 AND agent = 0 LIMIT 120; 

首先我想在某些指标优化或锁定的问题,我是一些时间研究这一点,但后来我发现这一点:

SELECT id FROM example WHERE done = 0 AND agent = 0 LIMIT 120; 
... 
... 
... 
120 rows in set (0.27 sec) 


SELECT text FROM example WHERE done = 0 AND agent = 0 LIMIT 120; 
... 
... 
... 
120 rows in set (0.83 sec) 

现在我迷路了,怎么获得单独标识或文本列具有完全相同的查询(WHERE相同和限制)完美的作品,然后得到他们两个不是?

在两次查询后再次执行“SELECT id,text ...”具有相同的效果,永不返回。

任何帮助表示赞赏,一个InnoDB大师可以帮助;)

新增信息: 看起来不像一个交易锁定问题,看的响应时间为下一个查询的指数级增长:

SELECT id, text FROM example WHERE done = 0 AND agent = 0 limit 109; 
... 
109 rows in set (0.31 sec) 

SELECT id, text FROM example WHERE done = 0 AND agent = 0 limit 110; 
... 
110 rows in set (3.98 sec) 

SELECT id, text FROM example WHERE done = 0 AND agent = 0 limit 111; 
... 
111 rows in set (4 min 5.00 sec) 
+0

告诉我们关于你的数据库的并发上下文的更多信息 – Sebas 2013-04-11 19:41:48

+0

嗨Sebas,请参阅我刚刚添加的信息,看起来不是交易/锁相关的问题。此外,现在没有其他进程正在查询数据库,只有我在控制台上试图对其进行调试。 – Lix 2013-04-11 20:34:18

+0

尝试增加你的innodb缓冲池http://dev.mysql.com/doc/refman/4.1/en/innodb-buffer-pool.html – Sebas 2013-04-11 20:38:28

回答

1

我找到了解决我自己的问题,我想在这里分享,因为这很奇怪,至少对我而言。

我一直认为每次查询后mysql客户端返回的时间延迟(例如“120行(0.27秒)”)是用于生成结果的时间,但不是。

问题是网络问题!与mysql服务器没有任何关系!

所以,我发现,反对我一直以为,那每次查询后显示的mysql客户端的时间包括网络延迟。同一个数据中心中的服务器同时发出的请求与mysql服务器以及另一个国家的另一个服务器返回的时间不同(大体不同)。

+0

是的,我觉得有点傻,假设你的服务器是本地的,因为如果没有,这是绝对明显的! – Sebas 2013-04-19 00:38:20