1个sql查询有时候快 有时候慢
select  count(distinct(ul.userId)) number,      CASE        WHEN ul.lastaccess>curdate() THEN 1     WHEN (ul.lastaccess>subdate(curdate(),1)
 and ul.lastaccess<curdate()) THEN 2            WHEN (ul.lastaccess>date_Sub(curdate(), INTERVAL DAYOFMONTH(curdate())-1 day)) THEN 3           
    WHEN (ul.lastaccess>date_sub(date_Sub(curdate(), INTERVAL DAYOFMONTH(curdate())-1 day),INTERVAL 1 month)
 and ul.lastaccess<DATE_SUB(sysdate(),INTERVAL 1 month)) THEN 4         ELSE 5  END as dateInterval from        SessionLog ul group by dateInterval;执行发现有 copy tmp table on disk....有时候这个查询要花25s,有时候6-7s。
我准备加force INDEX (idx_USL_lastaccess)。 但是发现执行计划没有走这个索引。
慢查询日志每天都有这个sql。主要原因 SessionLog 有200万记录。这个sql如何优化 , 做个视图(定时刷新) 存储过程 ?

解决方案 »

  1.   

    快的时候,是因为你的临时表太小。
    慢的时候,是因为你的临时表大大。如果实在没有办法优化的话
    加大: tmp_table_size吧。
      

  2.   

    在字段dateInterval建立个索引看看是否能提升点吧你这个查询很明显是全表扫描的啦
    200万的记录,肯定慢了
    考虑改个处理逻辑吧,如类似你所说的“做个视图(定时刷新) 存储过程 ”就是一个逻辑处理优化方法。
      

  3.   

    CASE        WHEN ul.lastaccess>curdate() THEN 1    WHEN (ul.lastaccess>subdate(curdate(),1)
    and ul.lastaccess <curdate()) THEN 2            WHEN (ul.lastaccess>date_Sub(curdate(), INTERVAL DAYOFMONTH(curdate())-1 day)) THEN 3         
        WHEN (ul.lastaccess>date_sub(date_Sub(curdate(), INTERVAL DAYOFMONTH(curdate())-1 day),INTERVAL 1 month)
    and ul.lastaccess <DATE_SUB(sysdate(),INTERVAL 1 month)) THEN 4        ELSE 5  END as dateInterva请问这个如何建立索引??
      

  4.   

    这个可以不用管那么多关键是“from        SessionLog ul group by dateInterval; ”
      

  5.   

     group by dateInterval        is from CASE        WHEN ul.lastaccess>curdate() THEN 1    WHEN (ul.lastaccess>subdate(curdate(),1) 
    and ul.lastaccess <curdate()) THEN 2            WHEN (ul.lastaccess>date_Sub(curdate(), INTERVAL DAYOFMONTH(curdate())-1 day)) THEN 3        
        WHEN (ul.lastaccess>date_sub(date_Sub(curdate(), INTERVAL DAYOFMONTH(curdate())-1 day),INTERVAL 1 month) 
    and ul.lastaccess <DATE_SUB(sysdate(),INTERVAL 1 month)) THEN 4        ELSE 5  END as 
    dateInterva 
      

  6.   

    如果用存储过程
    mysql的存储过程能否返回客户端一个 dataset (类似sqlserver)否则如何返回一个行集
      

  7.   

    mysql存储过程可以直接返回行集的(类似sqlserver那样的)
      

  8.   

    我是在Java里调用这个存储过程(执行返回行集)
    问java代码如何取存储过程返回的行集
      

  9.   

    归根到底
    还是
    count(distinct 是sql变慢
    ----请问这个函数有没有什么方法替换  (特别是distinct   太慢了)