第一条语句
检查慢查询日志发现
一个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.... 有时候这个查询要花155s(经常发生 容易发生柱塞),有时候6-7s。 
我准备加force INDEX (idx_USL_lastaccess)。 但是发现执行计划没有走这个索引。 
慢查询日志每天都有这个sql 随着时间的加上,过了半年,发现这个语句随着表记录增加,速度开始变慢。 主要原因 SessionLog 有500万记录。  (要申明,SessionLog 这个表在不停插入数据) 
这个sql如何优化 , 做个视图(定时刷新) 存储过程 ? 

解决方案 »

  1.   

    最好能修改一下表的字段 加个标识位置 当满足不同条件update不同的值 这个可以做个触发器实现
      

  2.   

    如将SessionLog的信息只保留短时期的,每天统计只进行一次,并将汇总结果存到另一个表里面去,避免每次查询都要统计一次。
      

  3.   

    也可以考虑在insert时就进行计数并记录下来
      

  4.   

    "考虑在insert时就进行计数并记录下来 
    "
    ---这个是最实际可行的, 可以加入一个字段
      

  5.   

    发现失败
     CASE        WHEN ul.lastaccess>curdate() THEN 1
    这个curdate 是当前日期