我有以下查询,在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字段中加入。这真的应该很简单,我不知道为什么我在努力寻找一些东西。
答案 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上没有索引。您当然应该考虑在子查询中对静态字段进行过滤的必要性。应该可以在日期上过滤一次,然后在较小的集合上进行子查询。