2010-05-31 22 views
1

我有以下查询这是在一个1500行的表上羚牛3秒,有人知道如何简化它?我需要简化一个MySQL子查询的性能 - 请帮助

SELECT dealers.name, dealers.companyName, dealer_accounts.balance 
FROM dealers 
    INNER JOIN dealer_accounts 
    ON dealers.id = dealer_accounts.dealer_id 
WHERE dealer_accounts.id = (
    SELECT id 
    FROM dealer_accounts 
    WHERE dealer_accounts.dealer_id = dealers.id 
    AND dealer_accounts.date < '2010-03-30' 
    ORDER BY dealer_accounts.date DESC, dealer_accounts.id DESC 
    LIMIT 1 
) 
ORDER BY dealers.name 

我需要为每个经销商的最新dealer_accounts记录在某一日期与上dealer_accounts表dealer_id场的连接。这真的应该很简单,我不知道为什么我很难找到一些东西。

+0

'DEALER_ACCOUNTS.id'是一个自动增量吗?并且是否有可能让'DEALER_ACCOUNT'具有“日期”值?否则,'MAX(dealer_accounts.id)'应该没问题。 – 2010-05-31 23:43:05

+0

感谢您的评论,但是日期可以不按顺序添加,否则您的建议将起作用。谢谢您的帮助! – Richard 2010-06-01 01:51:58

回答

0

您可以尝试使用两个查询而不是一个查询,即获取ID并使用该查询而不是子查询。这可能会告诉你哪个查询很慢。另外我相信MySQL会缓存单独的查询,加速多个请求。

你在桌子上有索引吗?一般来说,你应该索引你过滤或排序的任何列。在你的例子中,肯定是dealer_accounts.date列。

我假设ID字段是主键,如果是这样的话,那么将dealer_accounts.id添加到排序标准中毫无意义。

+0

我真的想看看我是否错过了显而易见的事实,结果表明查询不是太糟糕,我只想要最新的帐户,所以我一直在想,会有一个更简单的方法来做到这一点。 但是您的索引编制是正确的,我将db更改为innodb,并在dealer_id上添加了一个索引,并将其降至302毫秒,虽然它不是非常快,但仍然非常合理,比我的速度快了10倍。再次感谢您的帮助 – Richard 2010-06-01 00:18:50

0

我不知道为什么你不能只是这样做:

SELECT 
    dealers.name, dealers.companyName, dealer_accounts.balance 
FROM 
    dealers, dealer_accounts 
WHERE 
    WHERE dealer_accounts.dealer_id = dealers.id 
    AND dealer_accounts.date < '2010-03-30' 
ORDER BY dealer_accounts.date DESC, dealer_accounts.id DESC 

尝试MySQL的EXPLAIN你的查询计划。如果你看到TABLE SCAN,那就是为什么你的查询太慢了。

我不知道你的桌子上有什么索引,但添加合适的索引可能会有所帮助。解释计划可以告诉你他们缺乏的地方。

+0

不幸的是,您示例中的语法不正确,但您的解释建议对未来的参考很有帮助。我自己仍然不知道为什么GROUP BY dealer_id ORDER BY日期DESC,ID DESC不会带来最新的帐户记录。但我设法通过切换到innodb和索引dealer_id来加速它达到可接受的水平。再次感谢您的帮助 – Richard 2010-06-01 00:27:47

0

您的子查询运行了很多次,我怀疑您没有在dealer_accounts.date和dealer_accounts.dealer_id上的索引。您当然应该看看是否需要在子查询中的静态字段上进行筛选。应该可以过滤一次日期,然后在较小的集合上执行子查询。

+0

我认为您对子查询和时间运行是正确的。至于过滤,我认为你是对的,但我不想跳进去,因为它会使它复杂一点。但的确将其改为innodb并在dealer_id上添加索引加快了10倍!我很高兴......感谢您的帮助 – Richard 2010-06-01 00:21:37