左联 - 如何提高效率?

时间:2016-09-22 15:59:24

标签: mysql

我写了一个难以阅读的查询,我担心效率可能会很差。在将每个表中的消费者对与consumerdata.consumerid匹配方面,是否可以更有效地编写此查询?

select 

consumerdata.consumerid, 
signupdate, 
city, 
state, 
year(DOB), 
topaffiliate, 
activestatus, 
lastuseddate,

(select sum(achload.transactionamount) from achload where achload.consumerid = consumerdata.consumerid) as Total_ACH,
(select sum(billpay.transactionamount) from billpay where billpay.consumerid = consumerdata.consumerid) as Bill_Pay,
(select sum(recharge.transactionamount) from recharge where recharge.consumerid = consumerdata.consumerid) as Revenue,
(select count(cash.consumerid) from Cash where cash.consumerid = consumerdata.consumerid) as Cash__TXNs,
(select sum(moneytransfer.transactionamount) from moneytransfer where moneytransfer.consumerid = consumerdata.consumerid) as Transfer,
(select sum(moneytransfer.commissionfeeamount) from moneytransfer where moneytransfer.consumerid = tbl_accounts_consumerdata.consumerid) as commission_fee,
(select count(interchangetransactions.transactiondescription) from interchangetransactions where interchangetransactions.transactiondescription = "Withdrawal" and interchangetransactions.consumerid = consumerdata.consumerid) as Withdrawals,
(select count(interchangetransactions.responsecode) from interchangetransactions where interchangetransactions.responsecode in (01) and interchangetransactions.consumerid = consumerdata.consumerid and interchangetransactions.transactiondescription = "Withdrawal") as Code_01,
(select count(interchangetransactions.responsecode) from interchangetransactions where interchangetransactions.responsecode in (02) and interchangetransactions.consumerid = consumerdata.consumerid and interchangetransactions.transactiondescription = "Withdrawal" ) as Code_02,
(select count(interchangetransactions.transactiondescription) from interchangetransactions where interchangetransactions.transactiondescription IN ("2 Cash Advance", "1 Cash Advance") and interchangetransactions.consumerid = consumerdata.consumerid) as Cash_Advance_Count,
(select count(interchangetransactions.transactiondescription) from interchangetransactions where interchangetransactions.transactiondescription IN ("Balance") and interchangetransactions.consumerid = consumerdata.consumerid) as Inquiry_Count,
(select sum(interchangetransactions.transactionamount) from interchangetransactions where interchangetransactions.transactiontypecode = 195 and interchangetransactions.consumerid = consumerdata.consumerid)  as Intnl_TXN_Sum,
(select count(interchangetransactions.transactionamount) from interchangetransactions where interchangetransactions.transactiontypecode = 195 and interchangetransactions.consumerid = consumerdata.consumerid)  as Intnl_TXN_Count


from
consumerdata

left join achload
on achload.consumerid=consumerdata.consumerid

left join  billpay
on billpay.consumerid = consumerdata.consumerid

left join recharge
on recharge.consumerid = consumerdata.consumerid

left join cash
on cash.consumerid = consumerdata.consumerid

left join moneytransfer
on moneytransfer.consumerid = consumerdata.consumerid

left join interchangetransactions
on interchangetransactions.consumerid = consumerdata.consumerid

where consumerdata.signupdate between date(20120101) and curdate()
group by consumerdata.consumerid order by signupdate asc;

1 个答案:

答案 0 :(得分:1)

由于您没有从任何事务表中选择任何内容,因此一个简单的改进就是删除所有<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <table id=5 aria-label="Help"> <thead></thead> <tbody> <tr> <div class='abc'> <label><a><span class='text'>Game of thrones</span></a></label> </div> </tr> <tr> <div class='abc'> <label><a><span class='text'>Harry Potter</span></a></label> </div> </tr> <tr> <div class='abc'> <label><a><span class='text'>X-Men</span></a></label> </div> </tr> <tr> <div class='abc'> <label><a><span class='text'>X-Men 2</span></a></label> </div> </tr> <tr> <div class='abc'> <label><a><span class='text'>X-Men 3</span></a></label> </div> </tr> </tbody> </table>子句。它们不会用于任何事情,因为您从相关子查询中获取总数。这导致数据库在所有表之间创建一个巨大的交叉产品,然后在底部执行LEFT JOIN时将其丢弃。

另一种方法是连接子查询,计算每个事务表的分组总数,而不是相关的子查询。

GROUP BY

我不确定哪种方式实际上会更快 - 这可能取决于注册日期超出您指定范围的消费者的交易表中有多少数据。试试两者,看看哪个更好。