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如何优化 , 做个视图(定时刷新) 存储过程 ?
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如何优化 , 做个视图(定时刷新) 存储过程 ?
慢的时候,是因为你的临时表大大。如果实在没有办法优化的话
加大: tmp_table_size吧。
200万的记录,肯定慢了
考虑改个处理逻辑吧,如类似你所说的“做个视图(定时刷新) 存储过程 ”就是一个逻辑处理优化方法。
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请问这个如何建立索引??
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
mysql的存储过程能否返回客户端一个 dataset (类似sqlserver)否则如何返回一个行集
问java代码如何取存储过程返回的行集
还是
count(distinct 是sql变慢
----请问这个函数有没有什么方法替换 (特别是distinct 太慢了)