MongoDB快速删除最佳方法

时间:2013-05-16 07:43:19

标签: mongodb partitioning

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

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

3 个答案:

答案 0 :(得分:9)

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

另一方面,如果您的要求是根据时间戳删除数据,那么a TTL index可能就是您正在寻找的内容。

关于上限收藏的官方文件:

  

加盖的集合会自动删除集合中最旧的文档,而无需脚本或显式删除操作。

关于TTL指数:

  

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

答案 1 :(得分:4)

我想,即使我迟到了,已经接受了答案,我还会多补充一点。

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

TTL是一个很好的答案,但它不如drop()快。 TTL基本上是MongoDB做同样的事情,服务器端,你应该在你的应用程序中判断一行是历史的并删除它。如果过度使用,将对性能产生不利影响。不仅如此,它还不擅长为你的$freelist释放空间,这是在MongoDB中停止碎片的关键。

drop()一个集合将在现场直接“删除”该集合,立即优雅地将该空间返回给MongoDB(而不是操作系统),让您绝对没有任何碎片。不仅如此,与其他大多数替代方案相比,90%的时间操作都要快得多。

所以我会坚持我的评论:

  

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

修改

正如@Zaid所指出的那样,即使_id字段上限的集合也不可分割。

答案 2 :(得分:0)

对此的一个解决方案是使用支持分区的TokuMX: https://www.percona.com/blog/2014/05/29/introducing-partitioned-collections-for-mongodb-applications/

优于封顶集合的优势:封顶集合使用固定数量的空间(即使您没有这么多数据),也无法即时调整大小。分区集合的使用取决于数据;您可以根据需要添加和删除分区(对于新插入的数据)。

优于TTL:TTL很慢,它只需要自动删除旧数据。分区很快 - 删除数据基本上只是一个文件删除。

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