我必须优化我的小数据库,因为它太慢了,也许我们会一起找到另一个解决方案。构建数据库结构的另一种方法
首先让我们谈谈存储在数据库中的数据。有两个对象:users
,让我们说messages
用户
有类似的东西:
+----+---------+-------+-----+
| id | user_id | login | etc |
+----+---------+-------+-----+
| 1 | 100001 | A | ....|
| 2 | 100002 | B | ....|
| 3 | 100003 | C | ....|
|... | ...... | ... | ....|
+----+---------+-------+-----+
有这个表里面没有问题。 (不要怕id
和user_id
。user_id
被其它应用程序,因此它必须是在这里。)
消息
,第二个表有一定的问题。每个用户有这样的例子消息:
+----+---------+------+----+
| id | user_id | from | to |
+----+---------+------+----+
| 1 | 1 | aab | bbc|
| 2 | 2 | vfd | gfg|
| 3 | 1 | aab | bbc|
| 4 | 1 | fge | gfg|
| 5 | 3 | aab | gdf|
|... | ...... | ... | ...|
+----+---------+------+----+
没有必要edit
消息,但应该有一个机会来更新用户信息列表。例如,外部服务将所有用户的消息发送到数据库,并且必须更新列表。 而最重要的是,大约有30亿的用户和普通用户有500多条消息。另一个问题,我必须通过搜索字段from
并计算匹配数量。我使用join设计了一个简单的SQL查询,但获取数据需要太多时间。
所以......这是相当大的数据量。我决定不使用RDS(我使用Postgresql),并决定迁移到Clickhouse
等数据库。
但是我遇到了一个问题,例如Clickhouse
不支持UPDATE
语句。
要解决此问题,我决定将消息存储为一行。所以表Messages
应该是这样的:
Here I'd like to store messages in JSON format
{"from":"aaa", "to":bbe"}
{"from":"ret", "to":fdd"}
{"from":"gfd", "to":dgf"}
||
\/
+----+---------+----------+------+ And there I'd like to store the
| id | user_id | messages | hash | <= hash of the messages.
+----+---------+----------+------+
我认为messages
柱内的全文搜索将节省一些时间资源等。
你有什么想法吗? :)
我必须说你的问题非常广泛。首先,哪些类型来自并列太多?其次,当你使用PostgreSQL时,你是如何使用索引的?你看看分区吗? –
'from'和'to'是varchar(255),我没有看分区......你能提供一些教程吗? – Ascelhem