2012-11-23 37 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条件移入子查询。