帮我优化下这条sql的in

        Select SUM(fen) sum  from jifen where  type='qiandao' and  DATE_FORMAT( nl_time, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )  and nl_uid in
        (select uid  from user where user_type='2') 

数据太大查询速度太慢,3分钟都出不来,建立的索引无用!该怎么优化下

主要是in 这个语句怎么才能走索引啊!in修改优化下

阅读 2.4k
4 个回答

你违反了SQL原则,不要让SQL服务器给你做计算

nl_time 是什么类型的字段?

Select SUM(j.fen) sum  
 from jifen j
  inner join `user` u on j.nl_uid=u.uid
 where u.user_type='2' and j.type='qiandao' 
   and  nl_time >= DATE_FORMAT(CURDATE(),'%Y-%m-01 00:00:00') 
   and  nl_time <= DATE_FORMAT(LAST_DAY(CURDATE()), '%Y-%m-%d 23:59:59')

看你的需求是计算当前月的积分总数?
针对你这句DATE_FORMAT( nl_time, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )进行改造了下,

nl_time >= DATE_FORMAT(CURDATE(),'%Y-%m-01 00:00:00') 
and nl_time <= DATE_FORMAT(LAST_DAY(CURDATE()), '%Y-%m-%d 23:59:59')

这样是可以用到索引的。jifen表加个nl_time的索引,正常就可以达到毫秒级了

楼上那个是对的,计算后不走索引。
in在mysql索引会失效,改join试一下

新手上路,请多包涵

where 条件中使用 DATE_FORMAT 这个函数会使索引失效的,建议在程序中处理

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题