语句如下:
select e.id
from ext e where (day('2007-04-05 17:21:32') - day(e.add_time) =1)
and e.clbj !='1' order by e.wfsj desc  limit 0,2;加上order by后通过网闸查询MySql要50多秒,不加又不行,这个语句的意思是查询日期的前天的记录中的前两条,高手帮着优化一下

解决方案 »

  1.   

    用 explain 
    select e.id from ext e where (day('2007-04-05 17:21:32') - day(e.add_time) =1)
    and e.clbj !='1' order by e.wfsj desc limit 0,2;
    看一下执行计划,在需要的地方建立索引.或者交换一下条件位置(看记录的情况)
      

  2.   

    select e.id
    from ext e where e.add_time<'2007-04-05'- ADD(CURDATE(),INTERVAL 1 DAY)
    and e.clbj !='1' order by e.wfsj desc  limit 0,2
    用这个试试,再在add_time上加索引
      

  3.   

    其实如果先求出查询日期前天的日期会好很多,不需要sql server作多次求值,而且查询速度会好很多。语句优化始终没有设计优化来得好。
      

  4.   

    首先,where条件中表达式左边最好只是简单的字段名,可以使用索引。
    于是可写成
    SELECT e.id FROM ext e WHERE e.add_time>=CANCAT(CURDATE() - INTERVAL 1 DAY,' 00:00:00') AND  e.add_time<=CANCAT(CURDATE() - INTERVAL 1 DAY,' 23:59:59')
    AND e.clbj !='1' ORDER BY e.wfsj DESC LIMIT 0,2不知道你的wfsj是什么字段,如果你要查的字段的顺序与add_time或者主键一致,那么最好改一下order by部分。最后用explain查看一下,查询type中至少应该是range类型,而extra中最好不要出现using temp filesort之类的东西