gpt4 book ai didi

ruby - 用于日志数据的 MongoDB 集合 : index or not?

转载 作者:可可西里 更新时间:2023-11-01 09:08:39 26 4
gpt4 key购买 nike

我正在使用 MongoDB 作为临时日志存储。该集合每小时接收约 400,000 个新行。每行包含一个 UNIX 时间戳和一个 JSON 字符串。

我想定期将集合的内容复制到 S3 上的一个文件,每小时创建一个包含约 400,000 行的文件(例如,today_10_11.log 包含上午 10 点到上午 11 点之间收到的所有行)。我需要在集合接收插入内容时进行此复制。

我的问题:与查询一个小时的行所花费的额外时间相比,在每小时 400,000 次插入的时间戳列上建立索引对性能有何影响。

有问题的应用程序使用 Ruby 编写,在 Heroku 上运行并使用 MongoHQ 插件。

最佳答案

Mongo 默认索引 _id 字段,而 ObjectId 已经以时间戳开始,所以基本上,Mongo 已经为您按插入时间索引了您的集合。因此,如果您使用的是 Mongo 默认值,则不需要为第二个时间戳字段编制索引(甚至添加一个)。

在ruby中获取对象id的创建时间:

ruby-1.9.2-p136 :001 > id = BSON::ObjectId.new
=> BSON::ObjectId('4d5205ed0de0696c7b000001')
ruby-1.9.2-p136 :002 > id.generation_time
=> 2011-02-09 03:11:41 UTC

为给定时间生成对象 ID:

ruby-1.9.2-p136 :003 > past_id = BSON::ObjectId.from_time(1.week.ago)
=> BSON::ObjectId('4d48cb970000000000000000')

因此,例如,如果您想加载过去一周内插入的所有文档,您只需搜索大于 past_id 且小于 id 的 _id。因此,通过 Ruby 驱动程序:

collection.find({:_id => {:$gt => past_id, :$lt => id}}).to_a
=> #... a big array of hashes.

当然,您也可以为时间戳添加一个单独的字段,并对其进行索引,但是当 Mongo 已经使用其默认 _id 字段为您完成必要的工作时,没有必要再承受性能损失。

More information on object ids.

关于ruby - 用于日志数据的 MongoDB 集合 : index or not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4940034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com