我有一个如下数据模型:
username | product1 | product2
-------------------------------
harold abc qrs
harold abc def
harold def abc
kim abc def
kim lmn qrs
...
username | friend_username
---------------------------
john harold
john kim
...
我想建立一个最常见的product1到product2记录的直方图,仅限于给定的product1 id,并且只限于john的朋友。如下所示:
当product1 ='abc'时,john的朋友为product1链接了什么: 从朋友表中选择所有约翰的朋友。对于每个朋友,计算并分组product1 ='abc'的记录数,按desc顺序排序:
Results:
abc -> def (2 instances)
abc -> qrs (1 instance)
我知道我们可以在关系数据库中执行以下操作,但是会有一些阈值,这种查询将开始利用大量资源。用户可能拥有大量的朋友记录(500+)。如果每次用户加载页面时此查询运行5次,我担心我会快速耗尽资源。
我是否可以在我的模型中引入其他一些表来减轻每次用户希望看到直方图分解时执行上述查询的开销?我能想到的是在可能的情况下预先计算直方图,以便优化读数。
感谢您的任何想法
答案 0 :(得分:0)
这是您的查询:
SELECT p.product2,
COUNT(p.product2) AS num_product
FROM PRODUCTS p
JOIN FRIENDS f ON f.friend_username = p.username
AND f.username = 'john'
WHERE p.product1 = 'abc'
GROUP BY p.product2
ORDER BY num_product DESC
要处理5种产品,请使用:
SELECT p.product1,
p.product2,
COUNT(p.product2) AS num_product
FROM PRODUCTS p
JOIN FRIENDS f ON f.friend_username = p.username
AND f.username = 'john'
WHERE p.product1 IN ('abc', 'def', 'ghi', 'jkl', 'mno')
GROUP BY p.product1, p.product2
ORDER BY num_product DESC
这非常简单,你可以越多地过滤记录,因为它是一个较小的数据集,它运行得越快。
如果每次用户加载页面时此查询运行5次,我担心我会快速耗尽资源。
我的第一个问题是为什么每页都会多次运行此查询。如果要覆盖多个朋友,我发布的查询可以更新,以按朋友或用户的方式公开产品的计数。
之后,我想知道查询是否可以缓存。您真正需要的数据有多新鲜 - 是否可以接受2小时? 6或12怎么样...我们所有喜欢数据是即时的,但你需要权衡性能并做出决定。