检查MySQL中更新行的最佳方法

时间:2013-04-24 21:33:48

标签: mysql performance comparison timestamp

我试图查看自上次检查以来是否有任何行更新。 我想知道是否有更好的替代方案

"SELECT id FROM xxx WHERE changed > some_timestamp;"

然而,由于有超过200,000行,它可以变得非常快......是否会更好?

"SELECT count(*) FROM xxx WHERE changed > some_timestamp;"

我想过创建一个单元测试,但我还不是最好的那个/:

感谢您的帮助!


编辑:因为在很多情况下不会有任何行发生变化,所以最好先用MAX(xx)进行测试,如果它大于给定的旧更新时间戳,那么进行查询吗? / p>

2 个答案:

答案 0 :(得分:1)

如果您只想知道任何行是否已更改,则以下查询可能比您的任何一行更快:

SELECT id FROM xxx WHERE changed > some_timestamp LIMIT 1

仅为了完整性:确保您在changed上有索引。

编辑:性能改善很小

现在我考虑一下,你应该做SELECT change而不是选择id,因为这样就无法访问。如果执行了任何更改,此查询将很快告诉您。

SELECT changed FROM xxx WHERE changed > some_timestamp LIMIT 1

它应该比我的第一个查询快一点 - 但不是很多,因为访问单个表行会非常快。

我应该选择MAX(changed)吗?

按照Federico的建议选择MAX(changed)应该会产生相同的索引访问模式。找到索引中的最高元素是一种非常便宜的操作。找到任何大于某个常量的元素可能更便宜,因此两者应具有大致相同的性能。在任何一种情况下,如果 - 并且仅当 - 存在索引时,即使在非常大的表上,两个查询都非常快。

我应首先检查是否有任何行已更改,然后在单独的步骤中检索行

没有。如果没有更改的行,SELECT id FROM xxx WHERE changed > some_timestamp一样快任何此类检查,使得单独执行它毫无意义。当有结果时,它只会变成较慢的操作。除非您添加昂贵的操作(例如ORDER BY),否则性能应该(几乎)与检索到的行数呈线性关系。

答案 1 :(得分:1)

在some_timestamp上创建索引并运行:

SELECT MAX(some_timestamp) FROM xxx;

如果表格是MyISAM,则查询将立即生效。