【发布时间】:2016-11-12 06:17:49
【问题描述】:
这是我目前的结构:
// posts
+----+--------+----------+-----------+------------+
| id | title | content | author_id | date_time |
+----+--------+----------+-----------+------------+
| 1 | title1 | content1 | 435 | 1468111492 |
| 2 | title2 | content2 | 657 | 1468113910 |
| 3 | title3 | content3 | 712 | 1468113791 |
+----+--------+----------+-----------+------------+
// viewed
+----+---------------+---------+------------+
| id | user_id_or_ip | post_id | date_tiem |
+----+---------------+---------+------------+
| 1 | 324 | 1 | 1468111493 |
| 2 | 546 | 3 | 1468111661 |
| 3 | 135.54.12.1 | 1 | 1468111691 |
| 5 | 75 | 1 | 1468112342 |
| 6 | 56.26.32.1 | 2 | 1468113190 |
| 7 | 56.26.32.1 | 3 | 1468113194 |
| 5 | 75 | 2 | 1468112612 |
+----+---------------+---------+------------+
这是我的查询:
SELECT p.*,
(SELECT count(*) FROM viewed WHERE post_id = :id) AS total_viewed
FROM posts p
WHERE id = :id
目前我面临viewed 表的巨大约会。那么我的表结构(或数据库设计)有什么问题?换句话说,我该如何改进它?
像 stackoverflow 这样的网站有近 1200 万个帖子。每个帖子有(平均) 500 次查看。所以viewed的行数应该是:
12000000 * 500 = 6,000,000,000 rows
哈:-) .. 老实说,我什至看不懂那个数字(顺便说一句,这个数字会每秒增长)。那么stackoverflow如何处理每个帖子的查看次数?每次显示的帖子都会从viewed 计算count(*) 吗?
【问题讨论】:
-
好问题,您需要查看的是内存存储 (Redis),并且每次有人打开帖子时都不会计算 count(*),而是与此内存相关的密钥递增,然后每隔一段时间添加到表中
-
@YehiaAwad 所以我需要像 Redis 这样的无 sql 数据库来处理这个问题?
-
一个问题可以有一个整数,比如,查看次数。对某个问题的操作(例如某种类型的投票)可以在相交或Junction Table 中。 900M 人可以查看这个问题(我希望他们不会),并且它可能会在此过程中增加一个 view count int。不必添加任何行。然后是分区。
标签: mysql sql algorithm performance database-design