当前设计:
Table: users
------------------------------
| id | email |
------------------------------
| 1 | abc@xyz.com |
| 2 | def@mno.com |
| 3 | fun@ton.com |
Table: user_notes
-----------------------------------------------------
| id | user_id | content | created_at |
-----------------------------------------------------
| 1 | 1 | loreum ipsu | 2017-01-01 10:00:00 |
| 2 | 1 | loreum ipsu | 2017-01-02 11:00:00 |
| 3 | 2 | loreum ipsu | 2017-01-03 12:00:00 |
拟定设计:
Table: users
------------------------------
| id | email |
------------------------------
| 1 | abc@xyz.com |
| 2 | def@mno.com |
| 3 | fun@ton.com |
Table: user_1_notes
------------------------------------------
| id | content | created_at |
------------------------------------------
| 1 | loreum ipsu | 2017-01-01 10:00:00 |
| 2 | loreum ipsu | 2017-01-02 11:00:00 |
Table: user_2_notes
------------------------------------------
| id | content | created_at |
|-----------------------------------------
| 1 | loreum ipsu | 2017-01-01 10:00:00 |
我之所以提出这种设计,是因为我发现我们的mysql服务器(1cpu3.7gbgooglecloudsql)在运行了大约1亿行之后变得非常慢 user_notes
我们还可以创建将近40亿个表。
我们可以增加示例,这肯定会提高性能,但我们没有预算。我还没有进行性能测试。但我认为最好问问Maven群体
关于以上设计的利弊。
另外,如果我有预算,那么什么是实现同样目标的最佳方法呢
只需启动mysql服务器
转向其他技术,如云扳手、mongodb等。
或者其他。。。
更新
慢速查询(1分23秒)
SELECT * FROM user_tables WHERE user_id=2 AND DATE(created_at) >= '2017-01-01' AND DATE(created_at) < '2017-02-01'
注:
我对用户注解表的所有查询都是 WHERE user_id=XXX
我从不需要同时查询2个或更多用户
2条答案
按热度按时间zbsbpyhn1#
1.你目前的设计比提议的设计好得多
2.我的建议如果你有预算的话,那就增加mysql服务器
3.我不认为技术变革是明智的决定
ffscu2ro2#
你有索引吗
user_id
? 也许你可以从那里开始。建议的设计可能不是一个好主意,或者你使用mysql,mongodb或者其他的解决方案。
例如,在mongodb上,您应该尽可能嵌入文档,这意味着您最好使用以下内容:
然后,根据每个用户的笔记数量(可能很多),您必须知道文档大小限制(16mb,我上次听说)。所以,也许你现在的设计可能没那么糟糕。
如果你最终选择了这条路线,mysql现在也有一个类似mongodb的文档库,但是,我不确定googlecloud是否支持它(我不这么认为)。所以,最终,也许你不需要“转向其他技术”。
免责声明:我在mysql工作(但我不是模式设计Maven)