0

我有一个 MySQL 慢查询日志,显示相同的查询在几分钟内运行了两次。在此期间,表中没有添加任何内容,并且任何记录上的关键字段都没有更改。为什么检查的行数会不同?

# Time: 130615 11:35:59
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 32.198606  Lock_time: 0.000000 Rows_sent: 0  Rows_examined: 68851
SET timestamp=1371314159;
SELECT * FROM `projectaddresses` WHERE `ID_PROJECT` = 77 ORDER BY `ID_PROJECTADDRESS` ASC LIMIT 25 OFFSET 0;
# Time: 130615 11:37:22
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 30.030193  Lock_time: 0.000000 Rows_sent: 0  Rows_examined: 163319
SET timestamp=1371314242;
SELECT * FROM `projectaddresses` WHERE `ID_PROJECT` = 77 ORDER BY `ID_PROJECTADDRESS` ASC LIMIT 25 OFFSET 0;

此查询通常在一秒钟内返回。ID_PROJECTADDRESS 是主键,ID_PROJECT 上有一个基数为 110 的索引。

我在 MySQL 论坛上发现的唯一内容表明索引统计信息已更新,但我认为这在这里没有意义。

我认为这个查询通常运行得很快并且没有出现在慢查询日志中的事实与同一问题有关。任何关于该问题可能是什么的想法都将不胜感激。

4

1 回答 1

0

如果您的主键不是唯一的,那么 MySQL 只会读取行,直到它有 25 个匹配的行,然后它就会停止。除非您的 ORDER BY 是唯一的,否则无法保证每次都以相同的顺序读取行。以最方便的方式读取行,因此有时可能需要读取更多行才能找到匹配的 25 行。

于 2013-06-18T17:11:01.670 回答