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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |