0

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

"SELECT id FROM xxx WHERE changed > some_timestamp;"

但是,由于有 200,000 多行,它会很快变得很重……计数会更好吗?

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

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

谢谢您的帮助!


编辑:因为在许多情况下不会有任何更改的行,最好总是先使用 MAX(xx) 进行测试,如果它大于给定的旧更新时间戳,那么进行查询?

4

2 回答 2

1

在 some_timestamp 上创建索引并运行:

SELECT MAX(some_timestamp) FROM xxx;

如果表是 MyISAM,则查询将立即进行。

于 2013-04-24T23:42:15.197 回答
1

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

SELECT id FROM xxx WHERE changed > some_timestamp LIMIT 1

只是为了完整起见:确保您在changed.

编辑:一个微小的性能改进

现在我想了想,您可能应该做 aSELECT 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),否则性能应该(几乎)与检索的行数成线性关系。

于 2013-04-24T21:40:45.130 回答