MySql Innodb表奇怪的是SELECT锁/超时

时间:2013-04-11 19:39:49

标签: mysql select locking timeout innodb

我在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和LIMIT)分别获取id或text列是完美的,然后获得它们不是??

在两个查询具有相同效果后再次执行“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)

1 个答案:

答案 0 :(得分:1)

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

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

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

所以,我发现,与我一直认为的相反, mysql客户端显示的每个查询之后的时间包括网络延迟。来自与mysql服务器在同一数据中心的服务器和来自另一个国家的另一个服务器的同一请求会返回不同的时间(不同的时间)。