开发环境是SSH,
生产记录数据约5万条,读写较为频繁,
产品部署环境是应用服务器与数据库局域网访问。
开发测试时,hibernate生成后的sql访问本机数据库1-2秒出查询结果,而访问远程数据库则不定期的出现2-4分钟之后才有返回。
单次请求为查询5000条左右数据并聚合,直接查询该5000条数据响应很快,聚合为30条的过程耗时明显不正常。网上看了下,数据库已设置了禁用DNS解析,依然没解决问题。
大神看下是什么原因引起的?
MySQL

解决方案 »

  1.   

    hibernate 查询,内部做过优化处理;建议添加适当索引,并使用 explain 对SQL语句进行简单分析和优化;
    共享一下你的SQL查询脚本!
      

  2.   


    SELECT
      SUM(meadeliver0_.PDDO_RVOLUME) AS col_0_0_,
      SUM(CASE meadeliver0_.COUNT_STATUS 
       WHEN 2 THEN 0.0 
       ELSE meadeliver0_.PDDO_ACCEPT 
      END) AS col_1_0_,
      SUM(CASE meadeliver0_.CO_PUMP_FLG 
       WHEN 1 THEN meadeliver0_.PDDO_ACCEPT 
       ELSE 0.0 
      END) AS col_2_0_,
      SUM(CASE meadeliver0_.CO_DEPLOY_FLG 
       WHEN 1 THEN meadeliver0_.PDDO_ACCEPT 
       ELSE 0.0 
      END) AS col_3_0_,
      SUM(CASE meadeliver0_.CO_TRAIN_FLG 
       WHEN 1 THEN 1 
       ELSE 0 
      END) AS col_4_0_,
      commonday1_.DAY_KEY AS col_5_0_ 
     FROM
      cts2_cc.mea_delivery_order meadeliver0_,
      cts2_cc.common_day commonday1_,
      cts2_cc.crm_order_form crmorderfo2_ 
     WHERE
      meadeliver0_.CO_ID=crmorderfo2_.CO_ID 
      AND commonday1_.DAY_START<=meadeliver0_.PDDO_ODATE 
      AND (
       meadeliver0_.PDDO_TYPE IN (
        0 , 1
       )
      ) 
      AND (
       meadeliver0_.PDDO_STATUS IN (
        2 , 3
       )
      ) 
      AND commonday1_.DAY_END>=meadeliver0_.PDDO_ODATE 
      AND crmorderfo2_.COMP_ID=27 
      AND meadeliver0_.PDDO_ODATE>='2013年07月25日 08:00:00' 
      AND meadeliver0_.PDDO_ODATE<='2013年08月25日 07:59:59' 
     GROUP BY
      commonday1_.DAY_KEY这是HQL转换之后的SQL,若仅去除所有sum和group by 返回5000行数据,响应时间1-2秒,加上聚合查询返回30条聚合结果,响应时间2-4分钟
      

  3.   

    经查时间开销,300秒花费在了Copying to tmp table上。但是之前数据库优化了tmp_table_size = 128M,不明白为何会写到磁盘上。
      

  4.   

    调整了下SQL,group by 调整为主键字段,发现避开了tmp table,
    现在300秒开销到了Sending data,问题依然未解决
      

  5.   

    三个表的索引情况呢crmorderfo2_.COMP_ID=27 上加索引
    meadeliver0_.PDDO_ODATE这个上加索引
      

  6.   

    meadeliver0_.PDDO_ODATE这个上加索引后速度明显提升,结帖