MYSQL 几十万条产品数据(还会增加) 几千个用户(也会增加)
一个产品被一个客户获取后 就不能被其他客户获取
现在某一个用户 想去得到一个其他用户都没用过的产品
在大并发的情况下
怎么设计效率最高?
我现在想法是建一个 黑名单的表 black 然后里面产品 id 和用户 ID select * from 产品 where id not in(select 产品 from black where 用户 ID=用户 ID)
但是感觉这样一旦数据庞大后而且大并发下 效率会非常低
|      1acapla      2022-07-24 11:46:30 +08:00 12306 火车票的实现? | 
|  |      2qiayue PRO 产品表增加一列存储客户 ID ,0 表示没有被用过 | 
|  |      3neptuno      2022-07-24 12:16:45 +08:00 via iPhone 获取是指下单吗?量级不大的时候 redis 锁就能满足了吧 | 
|      5wufeng OP 我还有个思路就是 生成一个表 然后去 select 产品 1 用户 1 使用情况 产品 1 用户 2 使用情况 产品 1 用户 3 使用情况 产品 2 用户 1 使用情况 产品 2 用户 2 使用情况 产品 2 用户 3 使用情况 ----- 但是每增加一个用户就要增加几十万条 似乎是很笨的方法 | 
|      6lidlesseye11      2022-07-24 13:20:42 +08:00 一个产品被一个客户获取后 就不能被其他客户获取 产品 1 (用户 1 ,用户 3 ,用户 4 ,用户 5 ) 这不矛盾吗? | 
|  |      8BingoXuan      2022-07-24 13:30:13 +08:00 布隆过滤器,每个用户单独一个布隆过滤器,随机取出产品,检查是否曾经被使用过。 | 
|  |      9dr1q65MfKFKHnJr6      2022-07-24 13:46:44 +08:00  3 看了 1 分钟, 硬是没看懂题目。。 | 
|  |      10dr1q65MfKFKHnJr6      2022-07-24 13:48:53 +08:00 针对用户自定义索引,毕竟用户才几千 | 
|      1128Sv0ngQfIE7Yloe      2022-07-24 13:53:39 +08:00 >> 一个产品被一个客户获取后 就不能被其他客户获取 >> 产品 1 (用户 1 ,用户 3 ,用户 4 ,用户 5 ) ???? | 
|      12wufeng OP @lidlesseye11 第一次说错了 看补充 | 
|      13wufeng OP | 
|  |      15itechify PRO 是不是想问:产品可以被用户使用,用户 A 在搜索产品时,搜索不被 A 使用过的产品? | 
|      16wufeng OP @oneisall8955 是的 就是这个意思 | 
|      17makdon      2022-07-24 15:19:48 +08:00 用 redis ,搞个布隆过滤器,每次用户 A 用完之后就在 product:used:idA 里面 bfAdd 一下这个产品 id 每次搜索结果出来之后,过一下布隆,再返回布隆里面不存在的 前提是用户用过的产品集合在所有产品集合里面占比较低 | 
|  |      18reter      2022-07-24 16:16:36 +08:00 这种如何: 先拿到用户已使用的产品列表(数据规模较小 ): select * from 产品 as a where exist (select 1 from 产品使用情况 as b where b.用户 ID = 目标用户 ID and a.产品 id = b.产品 id and status=已使用) 其中,产品使用情况表只存储用户有使用过的产品,没有使用过的不要存储。如果用户曾经使用过某个产品,但后来又不使用了,可以更新状态,或者删除记录。 然后在查询的时候排除掉已使用的产品: select * from 产品 where 产品 NOT IN (用户已使用的产品列表) | 
|  |      19mitsuizzz      2022-07-25 13:54:41 +08:00 先 left join 然后 is null |