我的应用程序目前使用MySQL。为了支持非常快速删除,我根据时间戳在分区中组织数据。然后,当数据变得过时时,我只丢弃整个分区 它工作得很好,清理我的数据库不会损害我的应用程序性能。
我想用MongoDB替换MySQL,我想知道MongoDB中是否有类似的东西,或者我只需要逐个删除这些记录(我担心,它会非常慢并且会让我的数据库忙,并减慢查询响应时间)。
答案 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的出现,看起来我们将在没有适当解决方案的情况下陷入困境。