php - 字符串运算,如二进制 AND

标签 php mysql database-design

我正在尝试制作一个轻量级的推荐引擎。我已经连续思考了几个小时如何实现这一目标,我想我可能会做一些事情,但我需要第三人对此事的看法。这里是:

  • 假设我有 100,000 个可能的不同元素,每个用户都可以将任意数量的元素添加到他的库存中。

  • 用户也可以将这 100,000 个项目中的任何一个添加到他的愿望 list 中。

  • 假设一个用户在他的愿望 list 中添加了 100 件商品,我想找到库存中拥有这些商品的所有其他用户。然后根据谁提供的元素最多对它们进行排名。

我想到解决这个问题的第一个方法是通过简单的 MySQL 连接。我尝试启动一些测试数据,只有 50,000 个用户,每个用户都有自己的库存/愿望 list ,查询似乎非常慢(约 10 秒),分页又如何呢?因此,我考虑也许可以在不同的软件上进行数据聚合,将数据移植到另一个软件(或表格)以对它们进行分页。

我也尝试了一些方法(Redis LUA 循环、MongoDB MapReduce),但它们都获得了相同的速度。我想做的是能够实时做到这一点,我不禁想知道这是否可能,而且我只是还没有找到正确的解决方案。或者也许我只是把事情复杂化了。我最近的探索让我开始进行位与操作,因为我听说它们非常快,但我似乎也遇到了困难。

  • 我的想法是让每个用户拥有一个包含 100,000 个字符(其中包含 1 和 0)的字符串,其中每个字符/位将代表用户库存中的一个项目。

  • 每个用户的愿望 list 都会有另一个字符串,该字符串将用作对数据库的查询。

理想的情况是循环遍历每个用户,对愿望 list 与库存进行 AND 运算,并计算结果中的位数。循环完成后,将结果传输到另一个表,您可以在其中进行分页。

我知道 100,000 位二进制有点傻。甚至可以对这样的东西进行二元运算吗?您认为我忽略了其他解决方案吗?我还没有研究过的一件事是布隆过滤器,它可以消除用户愿望 list 上没有单个项目的用户,这将缩小要搜索的用户数量。我愿意接受任何建议。

编辑:

以下是我在 MySQL 中所做的我想要改进的事情:

SELECT
user_id, SUM(card_qty) qty
FROM (
    SELECT
    cc.user_id, card_info_id, LEAST(c.card_qty, cc.card_qty) card_qty
    FROM mb_decks d
    JOIN mb_decks_cards c USING (deck_id)
    JOIN mb_collection_cards cc USING (card_info_id)
    WHERE d.deck_id = 1
    AND cc.user_id <> d.deck_user_id
) t1
GROUP BY user_id
ORDER BY qty DESC;
# Showing rows 0 - 24 (33002 total, Query took 4.2979 sec)

请下载架构和测试数据here .

最佳答案

  1. 您的查询和表格是什么样的?通过适当的索引,这个问题对我来说应该不会太难。

  2. 如果您确实打算摆脱 mysql,elasticsearch 就是为这种快速查询而构建的。

关于php - 字符串运算,如二进制 AND,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25320766/

相关文章:

php - PHP 中的 strpos 函数问题找不到针

Mysql:查询 "WHERE...IN"、 "ORDER BY..."和 "LIMIT"中可能出现错误

database-design - "Badge"系统和任意标准的数据库架构 (MySQL/PHP)

php - 在AWS S3存储桶中上传图像为0字节

php - 使用变量用php更新mysql数据库

php - 每个帖子请求的 CSRF token 不匹配 Laravel 9

mysql - 如何设计一个 MySQL 表来跟踪每个 Assets 的状态以及每个旧状态?

mysql - 我应该在每次请求时打开 MySQL 连接还是始终打开?

mysql - 将 MySQL 表转换为 F# 矩阵

Oracle 首选列长度