1

我在 Innodb 表中的 SELECT 遇到了一个奇怪的问题,它永远不会返回,我等了两个多小时才看到结果,但没有,还在等待。

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)
4

1 回答 1

1

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

我一直认为 mysql 客户端在每次查询后返回的时间延迟(例如“120 rows in set (0.27 sec)”)是 mysql 服务器生成该结果所需的时间,但不是。

问题是网络问题!与mysql服务器完全没有关系!

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

于 2013-04-18T04:51:36.820 回答