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查询需要更多时间执行? 选择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

您主要需要在联接和where子句中使用的列上建立索引。其他索引不会为select语句增加值,也会降低插入和更新的速度

在本例中,您使用的是函数中的列值。因此,无法有效地使用索引

这样的表达式效率很低:

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