【发布时间】:2016-07-11 22:19:54
【问题描述】:
我需要在 table/Rails 模型中找到最近创建的记录,并且我想以一种有效的方式来完成它。我的主键是 UUID,因此使用 Rails Samples.last 方法将不起作用。对此进行谷歌搜索,Rails 的顶级答案使用sort ordered in descending order with a limit of 1。当然这不是唯一的方法,几年前我参加数据库课程时,我们经常用左外连接做这种事情。
我在 SQLServer 中尝试了这两种方法,但我对解释不太熟悉,无法判断哪种方法更好。我试过了:
SELECT TOP 1 * FROM samples ORDER BY created_at DESC;
这个解释显示了使用聚集索引扫描的排序。
SELECT * FROM samples s1
LEFT OUTER JOIN samples s2 ON s1.created_at < s2.created_at
WHERE s2.user_id IS NULL;
对此的解释显示了一个带有嵌套循环的过滤器,该过滤器使用两次聚集索引扫描。
这些中哪一个更好,或者它们是否具有可比性?还是我应该使用其他方法?排序版本对我来说似乎更清晰,所以我倾向于使用那个(我团队中的其他开发人员对 SQL 和数据库的了解甚至比我还少),但这将用于大型表,因此它需要高效。
另外,如果这很重要,我使用了 SQLServer,但我也有 MySQL 数据库,所以如果可能的话,我希望得到一个与数据库无关的答案。
【问题讨论】:
-
那么 TOP 不是不可知论者
-
我知道这一点。在 MySQL 中,它显然会使用 limit 重写。
-
这对我来说并不明显 ;-)
标签: mysql sql ruby-on-rails sql-server