select c.u_id, d.status, c.pm_id
from (select mb.u_id, max(pm_id) pm_id
from mass_user_mailbox mb
where mb.user_id = '100009'
group by mb.u_id) c
left join mass_user_mailbox d
on c.u_id = d.u_id
and c.pm_id = d.pm_id
这是公司之前的一个sql,因为此表数据量很大 现在查询速度超慢,有优化的空间吗, 此表建了两个索引user_id和pm_id
但我查询的时候f5还是全表查询,不知道为啥? 求鞭策。
------解决思路----------------------
1、内层查询的order by可以去掉
2、and trunc(pm.cdate) = to_date('time', 'yyyy-MM-dd')
这样通过函数转化后不会走cdate字段的索引的
可改成and pm.cdate>= to_date('time', 'yyyy-MM-dd') and pm.cdate< to_date('time', 'yyyy-MM-dd')+1
或是改成trunc(cdate)的函数索引
3、cdml_sensky_user 增加id的索引
4、cdml_sensky_user_add增加id的索引
5、not like很容易走全表扫描,根据业务看看有没有啥其他的方式过滤,或是看看不过滤对结果是否有影响
有时增加了条件以为数据量少了会快,但是如果因此不能走索引的话,有点得不偿失
------解决思路----------------------
给出字段的统计信息,和语句的执行计划吧
这样优化才比较有目的和针对性
