在mysql中获取未读文章的数据库设计(超过100M行表)

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)

重要信息

  1. read table每个用户的行数保持在1000以下.(删除旧数据)
  2. 文章表中的权重列经常更改.(这意味着订单没有修复)

问题是..(当用户数量:超过1M)

  1. 使用read表获取未读文章的方法(不在,外连接并不重要)
    • read table行数将超过1G

到目前为止它工作得很好(当前读取表行数:100M).但我必须准备下一步,因为用户数量正在迅速增加.

在这种情况下,大型服务的最佳方式是什么?

(分片?分区表?或重新设计架构?)

提前致谢

geo*_*j11 0

要点是,尽可能使用索引。

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表的数据大小,我们必须减少数据大小。为此,我们有多种选择:

  • MySQL分区:在user_id范围内创建分区(每个分区可能有10万个用户
  • 创建多个表:与分区类似,但是您将在不同的数据库中(甚至在不同的数据库服务器中)拥有数据。根据 user_id,您将决定要加入的表/数据库。

此外,您可以考虑定期归档旧数据,并且应用程序应该足够智能来决定是否需要查询归档表或活动表。