我们有以下表结构:
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交易的联系人。
非常感谢您的帮助
答案 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;