group by 非常慢 怎么办
SQL code
mysql中一万条数据group by非常慢 目前加索引了 还是很慢
SELECT
IFNULL(FUN_GET_BANK_NAME(CARD_NO), '其他') AS BANKNAME,
IFNULL(FUN_GET_CARD_NAME(CARD_NO), '其他') AS CARDNAME,
COUNT(*) AS COUNT,
SUM(IFNULL(TR_AMT, 0)) AS TR_AMT,
SUM(IFNULL(FEE_AMT, 0)) AS FEE_AMT
FROM T_MIS_LOG t
WHERE CONCAT(t.MTI, t.TRAN_TYPE) IN ('0200000000','0290000000')
GROUP BY FUN_GET_BANK_NAME(CARD_NO) ,FUN_GET_CARD_NAME(CARD_NO)
------解决方案--------------------对mysql不太了解,可以转到mysql板块去问一下。
------解决方案-------------------- SELECT
IFNULL(FUN_GET_BANK_NAME(CARD_NO), '其他') AS BANKNAME,
IFNULL(FUN_GET_CARD_NAME(CARD_NO), '其他') AS CARDNAME,
COUNT(id) AS COUNT
FEE_AMT
FROM T_MIS_LOG t
WHERE CONCAT(t.MTI, t.TRAN_TYPE) IN ('0200000000','0290000000')
GROUP BY FUN_GET_BANK_NAME(CARD_NO) ,FUN_GET_CARD_NAME(CARD_NO)
然后
SUM(IFNULL(TR_AMT, 0)) AS TR_AMT
SUM(IFNULL(FEE_AMT, 0)) ASFEE_AMT
分别试一下
看下哪个最慢
------解决方案--------------------我觉得楼主的SQL 慢在了使用了这两个函数FUN_GET_BANK_NAME(CARD_NO) ,FUN_GET_CARD_NAME(CARD_NO)在SQL 中。group by的字段应该使用表字段会快很多。
如果你系统中有相应的表 保存了card no 和bankname以及cardname的信息,你可以直接把这几个表和T_MIS_LOG 这个进行一个left join,然后再group by。这样会快很多。一万条数据不算大。
------解决方案-------------------- FUN_GET_BANK_NAME 是你自定义的函数?
用户自定义函数效率 必须的低。。。
------解决方案--------------------4.5 楼有理
------解决方案--------------------select
IFNULL(FUN_GET_BANK_NAME(CARD_NO), '其他') AS BANKNAME,
IFNULL(FUN_GET_CARD_NAME(CARD_NO), '其他') AS CARDNAME,
SUM(COUNT) AS COUNT,
SUM(TR_AMT) AS TR_AMT,
SUM(FEE_AMT) AS FEE_AMT
FROM (
SELECT CARD_NO,
COUNT(*) AS COUNT,
SUM(IFNULL(TR_AMT, 0)) AS TR_AMT,
SUM(IFNULL(FEE_AMT, 0)) AS FEE_AMT
FROM T_MIS_LOG t
WHERE CONCAT(t.MTI, t.TRAN_TYPE) IN ('0200000000','0290000000')
GROUP BY CARD_NO
) AS prestatic
GROUP BY
IFNULL(FUN_GET_BANK_NAME(CARD_NO), '其他'),
IFNULL(FUN_GET_CARD_NAME(CARD_NO), '其他')