MongoDB快速删除最佳方法

MongoDB快速删除最佳方法,mongodb,partitioning,Mongodb,Partitioning,我的应用程序目前使用MySQL。为了支持快速删除,我根据时间戳将数据组织在分区中。然后,当数据过时时,我只需删除整个分区。 它工作得很好,清理我的数据库不会损害我的应用程序性能 我想用MongoDB替换MySQL,我想知道MongoDB中是否有类似的东西,或者我只需要一个一个地删除记录(我担心这会非常慢,会让我的数据库很忙,并且会减慢查询响应时间) 在MongoDB中,如果您的要求是删除数据以限制集合大小,则应使用 另一方面,如果您的需求是基于时间戳删除数据,那么可能正是您所需要的 从关于封顶托

我的应用程序目前使用MySQL。为了支持快速删除,我根据时间戳将数据组织在分区中。然后,当数据过时时,我只需删除整个分区。
它工作得很好,清理我的数据库不会损害我的应用程序性能


我想用MongoDB替换MySQL,我想知道MongoDB中是否有类似的东西,或者我只需要一个一个地删除记录(我担心这会非常慢,会让我的数据库很忙,并且会减慢查询响应时间)

在MongoDB中,如果您的要求是删除数据以限制集合大小,则应使用

另一方面,如果您的需求是基于时间戳删除数据,那么可能正是您所需要的

从关于封顶托收的官方文件:

Capped collections自动删除集合中最旧的文档,而无需脚本或显式删除操作

关于TTL指数:

TTL集合作为一种特殊的索引类型实现,它可以在MongoDB中存储数据,并让mongod在指定的时间段后自动删除数据


我想,即使我迟到了,而且答案已经被接受了,我还是要补充一点

capped集合的问题是,它们经常驻留在集群中的一个碎片上。尽管在MongoDB的后一个版本中,capped集合是可共享的,但它们通常不是。此外,还必须当场分配一个有上限的集合,因此,如果您希望在清除数据之前有一个较长的历史记录,您可能会发现您的集合占用的空间远远大于它应该占用的空间

TTL是一个很好的答案,但是它没有
drop()
那么快。TTL基本上是MongoDB,它在服务器端执行与应用程序相同的操作,即判断一行何时为历史行并将其删除。如果操作过度,将对性能产生不利影响。不仅如此,它还不善于为您的
$freelist
s释放空间,这是阻止MongoDB中碎片化的关键

drop()
ing一个集合实际上就是当场“删除”该集合,立即优雅地将该空间返回给MongoDB(而不是操作系统),让您完全没有碎片。不仅如此,与大多数其他替代方案相比,操作速度要快得多,90%的时间都是如此

因此,我将坚持我的评论:


您可以根据数据成为历史数据所需的时间将数据分解为时间序列集合,然后只需删除()集合即可

编辑
正如@Zaid所指出的,即使使用
\u id
字段限制的集合也不可共享。

解决方案之一是使用支持分区的TokuMX:

相对于capped集合的优势:capped集合使用固定的空间量(即使您没有这么多数据),并且不能动态调整大小。分区集合的使用取决于数据;您可以根据需要添加和删除分区(对于新插入的数据)

与TTL相比的优势:TTL速度慢,它只负责自动删除旧数据。分区是快速的-删除数据基本上就是删除文件


然而:在被Percona收购后,TokuMX的开发似乎已经停止(希望在这一点上得到纠正)。不幸的是,MongoDB不支持此功能,随着TokuMX即将推出,我们似乎将在没有适当解决方案的情况下陷入困境。

您可以根据数据成为历史所需的时间将数据分解为时间序列集合,然后只需
drop()
收藏我认为主要问题是MongoDB有点差劲。我并不是说这是冒犯性的,也不是说我对NoSQL技术的工作原理一无所知,但有更好的替代方案可以达到与MongoDB相同的目的。关于这一点,有500个信息丰富的权威机构,但这里只有一个:我没有否决这一点,但有一个小小的观察是这样的。@ZaidMasud Good point,我只是假设听到人们在论坛上谈论这一点,并且封顶收藏现在有了一个可能的id字段,但实际上从未检查过他们现在是否有