我需要简化MySQL子查询的性能 - 请帮忙

时间:2010-05-31 23:23:42

标签: mysql

我有以下查询,在1500行的表格上羚牛3秒,有人知道如何简化吗?

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字段中加入。这真的应该很简单,我不知道为什么我在努力寻找一些东西。

3 个答案:

答案 0 :(得分:0)

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

桌子上有索引吗?通常,您应该索引您筛选或排序的任何列。在您的示例中肯定是dealer_accounts.date列。

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

答案 1 :(得分: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 PLAN。如果您看到TABLE SCAN,那就是您的查询速度太慢的原因。

我不知道您的表上有哪些索引,但添加适当的索引可能有所帮助。 EXPLAIN PLAN可以告诉你他们缺少的地方。

答案 2 :(得分:0)

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