Mysql - 查询包括sum和inner join

时间:2014-06-19 06:38:00

标签: mysql sql

我们有以下表结构:

Accounts: id | name .....

交易:

account_id | order_year | amount .....

我们的数据库已经非常大(> 300.000)帐户和交易> 1.000.000

在我们的帐户列表中,我们现在需要一个过滤器来搜索YYYY年内总金额超过XXXXEUR的帐户。

我们已经尝试过subselect(内部Join和sum,但我们的查询太慢了。

也许任何人都可以向我们提供一些关于如何对性能进行查询的提示。

感谢Pete

感谢您的快速回答......

现在我们还有与帐户相关的联系人,如下所示:

帐户:ID

联系人:id

account_contact:id | contact_id | ACCOUNT_ID

我们还需要在联系人中搜索所需的功能。

所以搜索年份(总计)超过YYYY EUR交易的联系人。

非常感谢您的帮助

2 个答案:

答案 0 :(得分:2)

试试这个:

select
  Accounts.id,
  sum(Transactions.amount) as TotalAmount
from
  Accounts
inner join
  Transactions on Transactions.account_id = Accounts.id
where
  order_year = YYYY
group by 
  Accounts.id
having
  sum(Transactions.amount) >= XXXX 

答案 1 :(得分:0)

所以我在MySQL 5.5上用SQL Fiddle http://sqlfiddle.com/#!2/3b45af/1/0编写了你的​​关系,并用大约填充它。 250,000个账户和1,000,000个交易。分析查询仅需1-2秒即可运行测试数据:

SELECT
   accounts.id
 , SUM(amount)
FROM accounts
JOIN transactions
  ON (accounts.id = transactions.account_id)
WHERE order_year = 2005
GROUP BY accounts.id
HAVING SUM(amount) > 1000000;

性能的关键部分是确保正确索引表。 accounts.id您可能已经隐式索引,因为它应该是PK。帮助的另一个索引是transactions.order_year上有一个非唯一索引:

CREATE INDEX transaction_year ON transactions(order_year);

transaction_year索引的效率取决于它的选择性。如果您有20年的交易,那么该指数将有很大帮助。如果您只有1 - 2年的交易,那么索引可能根本没有帮助。

编辑:

SELECT
   accounts.id
 , accounts.name
 , SUM(amount)
FROM accounts
JOIN transactions
  ON (accounts.id = transactions.account_id)
WHERE order_year = 2005
GROUP BY accounts.id, accounts.name
HAVING SUM(amount) > 1000000;