为了账号安全,请及时绑定邮箱和手机立即绑定

关于select id form table where id not in (1, 2, 3)的疑问,求指导

关于select id form table where id not in (1, 2, 3)的疑问,求指导

沧海一幻觉 2019-05-07 09:36:26
因为业务需求,我需要做一个向推荐用户视频的功能要求是已经推荐过的视频,下次不能重复推荐,我现在有2种做法第一种做法:每次用户拉取推荐视频列表时把视频id都用Redis储存起来比如拉取列表分页的第一页,共10个视频,我会把第一页的10个视频id存起来,下次拉取推荐视频列表时,我先从Redis中取出该用户的浏览过的视频id,然后用MySQL查询出来:selectid,titleformvideo_tablewhereidnotin(1,2...1000)limit10;第二种做法:建立一张浏览记录表user_browses,字段是user_id,video_id那么我每次向用户推荐视频时,就向这张表中插入浏览记录,下次拉取视频列表时,MySQL直接这样查询:selectid,titleformvideo_tablewhereidnotin(selectvideo_idfromuser_browseswhereuser_id=1)limit10;第一种做法是用Redis存用户的浏览记录,可以减轻MySQL写入压力,但是如果浏览记录特别多,比如1000个id,那我执行的SQL语句就特别长,这个样子会影响MySQL的查询性能吗?第二种做法SQL语句不会像一种做法那么长,缺点就是MySQL会多一点写入压力,而且查询的时候用子查询的方式,多查询一次请问这两种做法哪种更合适?
查看完整描述

2 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

首先notin的效率非常低,不会走index,无论你这两种做法都是要修改成notexist的
我的另外一种想法:
假设A用户看过的视频数量是N个,形成一个数组。从数据库中selectidfromvideo_table的速度是非常快的,假设得到一个长M的数组。
你只要从M与N的差集中随便选10个id取mysql查询就可以了。
这样mysql的压力就会变得很小,压力可以放到应用服务器上来。
                            
查看完整回答
反对 回复 2019-05-07
  • 2 回答
  • 0 关注
  • 510 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信