2012-11-23 38 views
0

這兩種方法哪一種更有效地從大型賬戶表中檢索account_balance?獲取最後一個插入的最有效方法

SELECT account_balance FROM accounts 
    WHERE account_no ='12345' 
    AND transaction_date =(SELECT MAX(transaction_date) FROM accounts); 


SELECT account_balance FROM accounts 
    WHERE account_no ='12345' 
    ORDER BY transaction_date DESC LIMIT 1 

或者如果有比這兩個更好的方法,我想知道。

編輯:transaction_date實際上是一個時間戳。不知道一開始是否對你們顯而易見。

+2

您的第一個查詢不會返回所需的結果 - 它在子查詢中必須具有'WHERE account_no ='12345''。 – a1ex07

+0

懷疑後者更有效率,雖然我沒有具體的證據 –

+0

我同意阿薩德。此外,如果您索引transaction_date,這應該很快。 – MikeSmithDev

回答

0

根據您要檢索的信息的嚴重程度,您可能還想使用表鎖。這將確保在獲取最新的行時不會發生其他事務。

在效率方面,我會選擇前者查詢(在子查詢account_no,並假設transaction_date是唯一的),因爲後者很可能將需要的文件排序(除非你有被下令transaction_date指數DESC)。

+0

是的,我認爲第一個查詢也會更有效率(但我還在學習),因爲後者產生的結果集仍然需要在後面排序。特別是如果它是一個大集合。 –

0

首先,您應該在查詢上運行EXPLAIN以瞭解MySQL如何「攻擊」問題。

假設transaction_date被索引(按降序排列),後面的選項更快,因爲它避免了同一個表上的(獨立的)子查詢。否則,前者更快,只要您將account_no條件移入子查詢。