BIG Query VS Query&在本地搜索VS多个查询到数据库

时间:2015-07-20 16:29:05

标签: mysql database performance

给出一个如下所示的数据库:

商品 item_id ,external_id,title,price,stock,is_active,...
订阅者 subscriber_id ,说明,callback_url,callback_parameters,auth_token
订阅 subscriber_id,product_id

和执行以下操作的脚本:

  1. 获取所有项目的列表
  2. 查询当前商品的价格
  3. 如果项目更新是重要的(自上次更新后价格差异很大)
    调用此项的订阅者回调。
  4. **我的问题是:** 什么会更好的做法?

    选项A:

    • 检索项目列表(~10k)
    • 检索订阅者列表(~50)
    • 检索订阅列表(~5k)

    并针对每次重要更新,在内存中搜索订阅者。

    pro:小网络延迟(3次查询)
    亲:网络流量相对较小(存在一些冗余)

    选项B:

    • 检索项目列表(~10k)

    并针对每个重大更改:再次查询数据库以查找特定项目的订阅者

    亲:最小流量
    con:高网络延迟(许多查询)

    选项C:

    • 查询DB加入订户列表

    pro:低延迟(1个查询)
    con:高网络流量,(数据冗余 - 每个用户将重复每个项目)...
    这是因为如果一个项目有4个订阅者,那么它的字段将被重复4次。

    谢谢, 汤姆W。

2 个答案:

答案 0 :(得分:0)

用更少的信息我会加入订阅项目并在内存中搜索订阅者(A和你的C的一半),

样品:

SELECT * from subscriptions, items where product_id = item_id

实际上,没有订阅的项目不能“回叫”。如果一个项目订阅了四次,这当然只列出项目及其订户ID,当然是4次。但是,假设所有50个订阅者订阅了所有产品,最终会产生500K记录,这对数据库来说不是问题。

以编程方式,您将处理另一个记录,显然不会将所有500K加载到mem。

答案 1 :(得分:0)

无。我会添加一个名为public class Link { public String bookName; public int quantity; public Link next; public Link(String bookName, int quantity){ this.bookName = bookName; this.quantity = quantity; this.next = null; } public void display(){ System.out.println("The number of " + bookName + " is " + quantity); } } class LinkedList{ public Link firstLink; public LinkedList(){ this.firstLink = null; } public boolean isEmpty(){ return (firstLink == null); } public void insertLink(String bookName, int quantity){ Link newLink = new Link(bookName, quantity); newLink.next = firstLink; firstLink = newLink; } public Link deleteFirst(){ if(this.isEmpty()){ System.out.println("The list is empty!"); } else{ Link temp = firstLink; firstLink = firstLink.next; return temp; } return null; } } 的列,这将保留旧价格。我会这样写我的选择:

old_price

这样您就可以在单个查询中获得所需的一切。结果将小于每条记录,因此不会占用太多带宽。此外,您将拥有您感兴趣的所有记录已存储在内存中,因此您可以随心所欲地执行任何操作。您可以通过创建新列的价格并在每次价格更新时维护它来实现此目的。我相信这是一个很好的协议。