各位大佬请问下,大量判断语句的优化思路

小李葛格 2019-04-27 10:59:32
现在公司有一项目,显示一个任务列表,每个任务都有一个标识filter_biaoshi
用户做过的任务会记录这个filter_biaoshi。

每次用户刷新任务列表的时候,会执行如下语句,以此来过滤以前做过的任务:
SELECT * FROM `task_consumer`
WHERE `status` = 0
AND
`filter_biaoshi` != '370bb1b5b2b0a16b0bd8ff13e474e9c7'

如果记录的任务标识多起来了,我现在的写法是:
SELECT * FROM `task_consumer`
WHERE
`status` = 0
AND
`filter_biaoshi` != '370bb1b5b2b0a16b0bd8ff13e474e9c7'
AND
`filter_biaoshi` != '54c4cbb36d0cba66b54c99a2e547d062'
AND
`filter_biaoshi` != 'b3c6850d43d25795e00ebb56474199e3'
AND
`filter_biaoshi` != '193e1f6bc3511d506882d55f19f50fe0'
........


后期数据获取会变得非常缓慢,索引是都加了的。使用explain查看type也是ref。请问下有什么优化的好办法吗?


...全文
151 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2019-04-29
  • 打赏
  • 举报
回复
#4 的思路是对的, 用 left join + is null 试下
叶遮沉阳 2019-04-28
  • 打赏
  • 举报
回复
一定要通过标识来查吗,可以另外加个字段呀,做过为1,没做的为0,通过等于1或0来查询,不是很方便么。
AHUA1001 2019-04-28
  • 打赏
  • 举报
回复
!=是不会走索引的。
优化的思路如下
加入a的可能性,只有1,2,3,4,5。
那么a != 1 and a != 2
可以优化成
select ... from tableName where a = 3
union all
select ... from tableName where a = 4
union all
select ... from tableName where a = 5
AHUA1001 2019-04-28
  • 打赏
  • 举报
回复
目前看,你的问题是如何把!=转换为=。
你新建一个临时表,把需要filter_biaoshi,都维护到这个表里,然后把你的那一大堆!=换成一个JOIN。
小李葛格 2019-04-28
  • 打赏
  • 举报
回复
引用 2 楼 叶遮沉阳 的回复:
一定要通过标识来查吗,可以另外加个字段呀,做过为1,没做的为0,通过等于1或0来查询,不是很方便么。
这个任务的标识是通过多个数据计算出来的md5,用来过滤的。如果只是1和0的话,过滤不完全的

56,679

社区成员

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

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