请优化这条SQL语句

hp44 2007-04-06 01:20:31
语句如下:
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多秒,不加又不行,这个语句的意思是查询日期的前天的记录中的前两条,高手帮着优化一下

...全文
235 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2007-04-09
  • 打赏
  • 举报
回复
首先,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之类的东西
wildlily980 2007-04-06
  • 打赏
  • 举报
回复
songjgonline()
是正解。
hp44 2007-04-06
  • 打赏
  • 举报
回复
库表是别人的,我只有查的权限
SuperLoaf 2007-04-06
  • 打赏
  • 举报
回复
其实如果先求出查询日期前天的日期会好很多,不需要sql server作多次求值,而且查询速度会好很多。语句优化始终没有设计优化来得好。
songjgonline 2007-04-06
  • 打赏
  • 举报
回复
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上加索引
yangxiao_jiang 2007-04-06
  • 打赏
  • 举报
回复
用 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;
看一下执行计划,在需要的地方建立索引.或者交换一下条件位置(看记录的情况)

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧