日期:2014-05-18  浏览次数:21078 次

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), '其他')