加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 用于日志数据的MongoDB集合:索引与否?

发布时间:2020-12-17 03:52:12 所属栏目:百科 来源:网络整理
导读:我使用MongoDB作为临时日志存储.该系列每小时收到约400,000个新行.每行包含一个UNIX时间戳和一个 JSON字符串. 我想定期将集合的内容复制到S3上的文件中,为每小时创建一个包含~400,000行的文件(例如,today_10_11.log包含在上午10点到11点之间收到的所有行).我
我使用MongoDB作为临时日志存储.该系列每小时收到约400,000个新行.每行包含一个UNIX时间戳和一个 JSON字符串.

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

我的问题:在400,000小时插入的时间戳列上有一个索引的性能影响是什么,以及查询一小时的行数所需的额外时间.

有问题的应用程序使用在Heroku上运行的Ruby编写并使用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的_ids.所以,通过Ruby驱动程序:

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

当然,您也可以为时间戳添加一个单独的字段并对其进行索引,但是当Mongo已经使用其默认的_id字段为您执行必要的工作时,没有必要采用该性能.

More information on object ids.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读