我有一个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论坛上发现的唯一一件事就是更新了索引统计数据,但我认为这不合理。
我认为此查询通常快速运行且未出现在慢查询日志中的事实与同一问题有关。关于这个问题的任何想法都会受到赞赏。
答案 0 :(得分:0)
如果您的主键不是唯一的,那么MySQL只是读取行,直到它有25个匹配的行,然后它就会停止。除非您的ORDER BY是唯一的,否则无法保证每次都以相同的顺序读取行。以最方便的方式读取行,因此有时可能需要读取更多行以找到匹配的行。