我试图查看自上次检查以来是否有任何行更新。 我想知道是否有更好的替代方案
"SELECT id FROM xxx WHERE changed > some_timestamp;"
然而,由于有超过200,000行,它可以变得非常快......是否会更好?
"SELECT count(*) FROM xxx WHERE changed > some_timestamp;"
我想过创建一个单元测试,但我还不是最好的那个/:
感谢您的帮助!
编辑:因为在很多情况下不会有任何行发生变化,所以最好先用MAX(xx)进行测试,如果它大于给定的旧更新时间戳,那么进行查询吗? / p>
答案 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,则查询将立即生效。