Mysql查询需要更多时间执行? 选择BB.NAME BranchName、VI.NAME Village、COUNT(BAC.CBSACCOUNTNUMBER)“账号”, 总和(BAC.CURRENTBALANCE)总和, 作为CreditTotal的总和(transactiontype为'C'的情况下,则金额为0结束), 金额(transactiontype为'D'时为案例,其余金额为0结束)作为借方总额, 合计(transactiontype为'C'时为案例,transactiontype为'D'时为金额,然后为-1*金额,否则为0结束)作为CurrentBalance 来自客户CU、申请人AP、地址AD、第六村、银行分行BB、银行账户BAC 左外部联接accounttransaction ACT.BANKACCOUNT\u CBSACCOUNTNUMBER=BAC.CBSACCOUNTNUMBER 和DATE_格式(ACT.TRANDATE,'%Y-%m-%d')
您主要需要在联接和where子句中使用的列上建立索引。其他索引不会为select语句增加值,也会降低插入和更新的速度 在本例中,您使用的是函数中的列值。因此,无法有效地使用索引 这样的表达式效率很低:Mysql查询需要更多时间执行? 选择BB.NAME BranchName、VI.NAME Village、COUNT(BAC.CBSACCOUNTNUMBER)“账号”, 总和(BAC.CURRENTBALANCE)总和, 作为CreditTotal的总和(transactiontype为'C'的情况下,则金额为0结束), 金额(transactiontype为'D'时为案例,其余金额为0结束)作为借方总额, 合计(transactiontype为'C'时为案例,transactiontype为'D'时为金额,然后为-1*金额,否则为0结束)作为CurrentBalance 来自客户CU、申请人AP、地址AD、第六村、银行分行BB、银行账户BAC 左外部联接accounttransaction ACT.BANKACCOUNT\u CBSACCOUNTNUMBER=BAC.CBSACCOUNTNUMBER 和DATE_格式(ACT.TRANDATE,'%Y-%m-%d'),mysql,mysql-workbench,Mysql,Mysql Workbench,您主要需要在联接和where子句中使用的列上建立索引。其他索引不会为select语句增加值,也会降低插入和更新的速度 在本例中,您使用的是函数中的列值。因此,无法有效地使用索引 这样的表达式效率很低: SELECT BB.NAME BranchName,VI.NAME Village,COUNT(BAC.CBSACCOUNTNUMBER) "No.Of Accounts", SUM(BAC.CURRENTBALANCE) SumOfAmount, SUM(CASE WHEN transactio
SELECT BB.NAME BranchName,VI.NAME Village,COUNT(BAC.CBSACCOUNTNUMBER) "No.Of Accounts",
SUM(BAC.CURRENTBALANCE) SumOfAmount,
SUM(CASE WHEN transactiontype = 'C' THEN amount ELSE 0 END) AS CreditTotal,
SUM(CASE WHEN transactiontype = 'D' THEN amount ELSE 0 END) AS DebitTotal,
SUM(CASE WHEN transactiontype = 'C' THEN amount WHEN transactiontype = 'D' THEN -1 * amount ELSE 0 END) AS CurrentBalance
FROM CUSTOMER CU,APPLICANT AP,ADDRESS AD,VILLAGE VI,BANKBRANCH BB,BANKACCOUNT BAC
LEFT OUTER JOIN accounttransaction ACT ON ACT.BANKACCOUNT_CBSACCOUNTNUMBER=BAC.CBSACCOUNTNUMBER
AND DATE_FORMAT(ACT.TRANDATE,'%Y-%m-%d')<='2013-05-09'
AND DATE_FORMAT(BAC.ACCOUNTOPENINGDATE,'%Y-%m-%d') <'2013-05-09'
AND ACT.BANKACCOUNT_CBSACCOUNTNUMBER IS NOT NULL
WHERE CU.CODE=AP.CUSTOMER_CODE AND BAC.ENTITY='CUSTOMER' AND BAC.ENTITYCODE=CU.CODE
AND AD.ENTITY='APPLICANT' AND AD.ENTITYCODE=AP.CODE
AND AD.VILLAGE_CODE=VI.CODE AND VI.STATE_CODE=AD.STATE_CODE AND VI.DISTRICT_CODE=AD.DISTRICT_CODE
AND VI.BLOCK_CODE=AD.BLOCK_CODE AND VI.PANCHAYAT_CODE=AD.PANCHAYAT_CODE
AND CU.BANKBRANCH_CODE=BB.CODE AND BAC.CBSACCOUNTNUMBER IS NOT NULL AND ACT.TRANSACTIONTYPE IS NOT NULL
GROUP BY BB.NAME,VI.NAME LIMIT 10;
and
below is my explain plan
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE AD index ADDRESS_ENTITYCODE ADDRESS_ENTITYCODE 598 NULL 47234 Using where; Using index; Using temporary; Using filesort
1 SIMPLE VI ref PRIMARY PRIMARY 62 fiserveraupgb.AD.VILLAGE_CODE 1 Using where
1 SIMPLE AP eq_ref PRIMARY,AppCodeIndex PRIMARY 62 fiserveraupgb.AD.ENTITYCODE 1
1 SIMPLE BAC ref BANKACCOUNT_ENTITYCODE BANKACCOUNT_ENTITYCODE 63 fiserveraupgb.AP.CUSTOMER_CODE 1 Using where; Using index
1 SIMPLE CU eq_ref PRIMARY,CustCodeIndex PRIMARY 62 fiserveraupgb.AP.CUSTOMER_CODE 1
1 SIMPLE BB ref PRIMARY,Bankbranch_CodeName PRIMARY 62 fiserveraupgb.CU.BANKBRANCH_CODE 1
1 SIMPLE ACT index NULL accounttransaction_sysidindes 280 NULL 22981 Using where; Using index; Using join buffer
将实体、ENTITYCODE和VILLAGE_代码列上的一个索引放在一起比为每个列单独索引更有效。它也可以帮助包括其他列
最后一点:如果一列或列的组合保证是唯一的,则创建一个唯一的索引。它在选择时稍微快一点
一般建议:不要将旧的联接语法与ansi联接混合使用。这让你的问题很难理解
这些提示(除了最后一个)应该会加快您的查询速度,但根据数据量、硬件和负载的不同,查询速度仍然可能较慢
DATE_FORMAT(ACT.TRANDATE,'%Y-%m-%d')<='2013-05-09'
AD.ENTITY = 'APPLICANT' AND
AD.ENTITYCODE = AP.CODE AND
AD.VILLAGE_CODE = VI.CODE