2016-07-11 24 views
0

我需要在表格/ 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數據庫,所以我希望如果可能的話數據庫不可知論的答案。

+0

嘛TOP不是不可知 – Strawberry

+0

我意識到這一點。在MySQL中,它顯然會使用限制來重寫。 – Maltiriel

+0

這對我來說並不明顯;-) – Strawberry

回答

1

假設你id列有一個索引,是一個主鍵,你可以放心地假設,最新的記錄將是一個最高的身份證號碼?

的查詢是:

SELECT * FROM samples ORDER BY id DESC LIMIT 1; 

或者,你可以使用Sample.last,這會爲你做它。

編輯:

由於您的iduuid,我會建議添加索引到created_at列,以避免全表掃描。然後,讓你的生活更輕鬆,你可以添加以下範圍到模型:

scope :first, -> { order("created_at").first } 
scope :last, -> { order("created_at DESC").first } 

希望這有助於!

+1

http://stackoverflow.com/questions/9780169/active-record-model-find-last假設一個主鍵的整數。我的是UUID。我將編輯該問題以反映這一事實。 – Maltiriel

+0

@Maltiriel我更新了答案。 –

+0

問題不是「我怎麼能在Rails中做到這一點」。我知道如何去做。問題是「什麼是最有效的方式」。默認的Rails做事情的方式不一定會導致最高效的數據庫查詢。 – Maltiriel

0

由於您使用的是Ruby on Rails,您是否嘗試過使用Sample.last

你可以在這裏閱讀更多:(?)Finder Methods: Last

+0

http://stackoverflow.com/questions/9780169/active-record-model-find-last我的主鍵是一個UUID,所以這不起作用。 – Maltiriel

0

我認爲你可以這樣做:

Sample.order(created_at: :desc).first