MySQL或MongoDB对数百万行进行了降序排序

时间:2013-06-10 16:42:59

标签: mysql mongodb

在每台服务器上,我将有几个客户数据库,其中包含用于用户活动,帐户更改日志和其他一些的表。在接下来的一年左右,每个表都会有数千万行添加到无穷大。

对于用户活动的情况,所有数据将按用户ID为X的时间按降序读取,但一次限制为大约10。

这看似合理,但对于几个数据库中的几个表,这是一个好的方法吗?我担心事情会慢慢减缓,特别是随着桌子在未来几年的增长。我应该以某种方式拆分桌子吗?

我想知道MySQL InnoDB是否是在每个客户数据库中存储此数据的最佳方式。我正在考虑MongoDB但是我一直在读,skip()变得非常慢,我找不到很多有关排序的细节然后跳过。也许还有另一种选择。

基本上什么是绝对最快的方式(存储然后)读取按时间降序排序的最新信息?显然,我会做任何事情来尽可能快地查看用户信息的阅读时间。

2 个答案:

答案 0 :(得分:2)

你需要尝试两种方式。

简单地说 - 这里确实没有正确的答案。它会在很大程度上取决于您的要求,架构或文档结构,查询,索引,硬件,您对碎片的意愿(以及硬件的可用性)等。

两者都适用于您想要实现的目标,每个都有自己的解决方案来解决这些类型的问题 - 例如:foreign keys and joins vs embedded documentssharding vs partitioning。如果操作正确,两个数据库都可以很好地工作。

随着您的扩展,您的性能改进很可能包括缓存,预聚合/预处理,mapreduce等 - 无论您选择哪个数据库后端。

MongoDB示例:

听起来最近的活动是最受欢迎的 - 这应该意味着即使您的馆藏增长,您的工作集在理论上也应该保持较小。因此,您可以为每个用户每天创建一个文档,其中包含每个活动的嵌入文档。

{
    _id: ObjectId(...),
    user: 123,
    timestamp: 1370847600,
    activities: [
        { _id: ObjectId(...), type: 1, msg: "Something was logged.", date: IsoDate(...) },
        { _id: ObjectId(...), type: 2, msg: "Something else was logged.", date: IsoDate(...) },
        //More Activities here...
    ]
}

如果您觉得某一天不够精细,或者您觉得您的文件太大 - 请按小时分组。这将有助于保持索引大小/工作集合理,并允许您通过连接获取多个活动。

但是,您也可能会发现,您需要更灵活地按类型或日期查询活动日志 - 在这种情况下,嵌入可能也不起作用。

答案 1 :(得分:1)

你的MySQL版本是什么? 如果它是5.1或更高版本,表是否是分区?我认为按年分区可能会有所帮助,因为您担心这些表会增长多年。