kim*_*.kr 6 mysql sql database database-design mariadb
这些信息非常简洁.
有2个表.
文章
-----------------------------------
|id | weight | text |
-----------------------------------
|1 | 10 | blah |
|2 | 100 | blah |
|3 | 50 | blah |
|4 | 1000 | blah |
-----------------------------------
Run Code Online (Sandbox Code Playgroud)
读
-----------------------------------
| user_id | article_id |
-----------------------------------
| 1 | 4 |
| 1 | 2 |
| 1 | 3 |
| 2 | 3 |
| 2 | 4 |
-----------------------------------
Run Code Online (Sandbox Code Playgroud)
我想使用以下查询获取未读文章(非常精简)
SELECT
a.*
FROM
article a LEFT OUTER JOIN read r ON r.article_id = a.id and r.user_id = 1
WHERE
r.id IS NULL
ORDER BY
a.weight DESC
LIMIT 10
Run Code Online (Sandbox Code Playgroud)
重要信息
read table每个用户的行数保持在1000以下.(删除旧数据)- 文章表中的权重列经常更改.(这意味着订单没有修复)
问题是..(当用户数量:超过1M)
read table行数将超过1G到目前为止它工作得很好(当前读取表行数:100M).但我必须准备下一步,因为用户数量正在迅速增加.
在这种情况下,大型服务的最佳方式是什么?
(分片?分区表?或重新设计架构?)
提前致谢
要点是,尽可能使用索引。
SELECT a.*
FROM a
LEFT JOIN read r
ON r.article_id = a.id and r.user_id =1
WHERE r.id IS NULL
ORDER BY a.weight DESC
LIMIT 10
Run Code Online (Sandbox Code Playgroud)
编辑:您关心的是read表的数据大小,我们必须减少数据大小。为此,我们有多种选择:
此外,您可以考虑定期归档旧数据,并且应用程序应该足够智能来决定是否需要查询归档表或活动表。