MySQL查询花费更多的时间来执行?(Mysql Query taking more time to

2019-10-30 07:47发布

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

MySQL服务器版本5.5和我使用下面的MySQL工作台是我的查询它正在13分钟来执行,请建议我创建了索引所有被涉及的列的最佳方法。

Answer 1:

你主要是需要对所使用的连接列和你的where子句中的索引。 其他股指也没有为自己的select语句增加价值,你的插入和更新减慢。

在这种情况下,您使用的功能列值。 由于该指标不能有效地使用。

像这样的表达式是非常低效的:

DATE_FORMAT(ACT.TRANDATE,'%Y-%m-%d')<='2013-05-09'

它会产生很多字符串转换的,因为所有的TRANDATES转换为其值的字符串表示。 这些值需要被暂时存储,并且不索引,从转换以便开,上ACT.TRANDATE任何索引不再使用。 这可能是导致相当昂贵的“使用加入缓冲液”在你说明计划的结束。

相反字符串“2013年5月9日”转换为日期值,并且使用这个值作为一个常量或参数为您的查询。

这样做的另一件事,是创建单独的列不是单独的索引,但对于在一个地方使用和/或加入一组列的一个指标。 例如,这部分:

AD.ENTITY = 'APPLICANT' AND 
AD.ENTITYCODE = AP.CODE AND 
AD.VILLAGE_CODE = VI.CODE

具有在列ENTITY,ENTITYCODE和VILLAGE_CODE在一起的一个索引会比具有用于它们中的每一个单独的索引更有效。 它可以帮助包括其他列以及。

而在去年:如果列的列或组合是保证是独一无二的,广告的唯一指标。 它是选择稍快。

一般的提醒:与ANSI连接不要将旧连接语法。 它使你的查询难以阅读。

这些提示(除了最后一个)应加快您的查询,但它仍然是缓慢的,这取决于数据量,硬件和负载。



文章来源: Mysql Query taking more time to execute?