如果您只想知道是否有任何行已更改,则以下查询可能比您的任何一个都快:
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
),否则性能应该(几乎)与检索的行数成线性关系。