我们正在开发的应用程序每天要编写大约4-5百万行数据。而且,我们需要在过去90天内保存这些数据。存储旧数据以更快访问的更好方式
表user_data
具有以下结构(简化):
id INT PRIMARY AUTOINCREMENT
dt TIMESTAMP CURRENT_TIMESTAMP
user_id varchar(20)
data varchar(20)
关于应用程序:
- 数据是旧超过7天将不会被写入/更新。
- 数据大多基于
user_id
访问(即所有查询将具有WHERE user_id = XXX
) - 目前大约有13000个用户。
- 用户仍然可以访问较旧的数据。但是,在访问旧数据时,我们可以限制他/她只能获取全天数据而不是时间范围。 (例如,如果用户试图获取2016-10-01的数据,他/她将获取全天的数据,并且无法获取2016-10-01 13:00 - 2016-10的数据-01 14:00)。
目前,我们正在使用MySQL InnoDB
存储的最新数据(即7天,较新的),它工作正常,并在innodb_buffer_pool
适合。
至于较旧的数据,我们以user_data_YYYYMMDD
的形式创建了较小的表格。过了一段时间,我们发现这些表格不适合innodb_buffer_pool
,它开始放慢速度。
我们认为基于日期分离/分片,基于user_ids的分片会更好(即使用基于用户和日期的较小数据集,例如user_data_[YYYYMMDD]_[USER_ID]
)。这将使桌子保持更小的数量(最多只有10K左右)。
围绕研究后,我们发现有出有几个选项:
- 使用MySQL表每日期的用户(即
user_data_[YYYYMMDD]_[USER_ID]
)来存储。 - 使用MongoDB的集合每个
user_data_[YYYYMMDD]_[USER_ID]
- 写旧数据(JSON编码)到
[USER_ID]/[YYYYMMDD].txt
最大的骗子我在这看到的是,我们将拥有的表/收藏/文件数量巨大的时候,我们这样做(即13000 x 90 = 1.170.000)。我想知道我们是否在未来的可扩展性方面接近正确的方式。或者,如果有其他标准化的解决方案。
谢谢,约书亚。一定会尝试探索更多关于PARTITION的内容。 –