给定一个如下所示的数据库:
商品:item_id、external_id、标题、价格、库存、is_active、...
订阅者:subscriber_id、描述、callback_url、callback_parameters、auth_token
订阅:subscriber_id、product_id
以及执行以下操作的脚本:
- 获取所有项目的列表
- 查询当前商品的价格
- 如果商品更新显着(自上次更新以来价格差异很大)
调用该项目的订阅者的回调。
**我的问题是:** 什么是更好的做法?
选项A:
- 检索项目列表(~10k)
- 检索订阅者列表 (~50)
- 检索订阅列表(~5k)
对于每个重要更新,在内存中搜索订阅者。
优点:网络延迟小(3 个查询)
pro:网络流量相对较小(存在一些冗余)
选项B:
- 检索项目列表(~10k)
对于每个重大更改:再次查询数据库以查找特定项目的订阅者
优点:最小流量
缺点:网络延迟高(很多查询)
选项C:
- 查询连接订阅者列表的数据库
优点:低延迟(1 个查询)
缺点:网络流量高,(数据冗余 - 每个订阅者的每个项目都会重复)...
这是因为如果一个项目有 4 个订阅者,它的字段将重复 4 次。
谢谢, 汤姆·W.
最佳答案
有了较少的信息,我会加入订阅项目并在内存中搜索订阅者(A 和 C 的一半),
示例:
SELECT * from subscriptions, items where product_id = item_id
实际上,没有订阅的项目是无法“回调”的。这只会列出项目及其订阅者 ID,当然,如果某个项目被订阅了四次,则列出 4 次。但是,假设所有 50 个订阅者都订阅了所有产品,最终将产生 500K 条记录,这对于数据库来说不是问题。
以编程方式,您可以通过一条记录处理另一条记录,显然不会将所有 500K 加载到内存中。
关于mysql - BIG 查询 VS 本地查询和搜索 VS 对数据库的多个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31521658/