MongoDB ObjectId的优化

标签: MongoDB 未分类 ObjectId | 发表时间:2012-03-15 13:25 | 作者:nosqlfan
出处:http://blog.nosqlfan.com

ObjectID,也就是我们在进行insert操作时会自动生成的_id字段。我们经常会看到它,这个字段的组成及其设计思路我们可以参考NoSQLFan之前的文章《 MongoDB文档(Document)全局唯一ID的设计思路》。

今天我们想讲一下对这个字段的一些优化,内容主要来源于 MongoDB官方文档。

1.使用业务中的唯一ID

_id字段在不指定时是自动生成的,也就是说,我们也可以在insert操作时自己指定它的值。如果你的业务中对每一条数据都有一个唯一ID,那么建议使用这个ID的值作为_id的值。比如存用户信息的collection,那么你可以使用用户的uid作_id的值,这样做有两个好处:

  • 减少原有_id对空间的占用
  • 让你的_id值意义更明确

2.使用自增数据为_id

由于_id字段是会自动创建索引的,所以如果你按上面的方法用业务中的唯一ID作为_id的值,那么它也会创建一个索引。所以如果你的ID值是一个自增长的字段,那么在insert操作修改索引时,就不需要将_id的索引整个加载到内存中了。(实际上自动生成的_id就有这个特性)

3.使用二进制数据,而非编码字符串

如果你打算设置的_id值是一个二进制的串,那么你不需要将它进行16进制编码后存在一个字符串,因为MongoDB支持BinData类型,你可以直接将二进制串作为_id的值进行存储。

而你也可以通过下面一些方法将二进制串转换为可读的字符串

> // mongo shell bindata info:
> help misc
        b = new BinData(subtype,base64str)  create a BSON BinData value
        b.subtype()                         the BinData subtype (0..255)
        b.length()                          length of the BinData data in bytes
        b.hex()                             the data as a hex encoded string
        b.base64()                          the data as a base 64 encoded string
        b.toString()

4.从 ObjectId中获取insert时间

如果你使用了默认的ObjectId作为_id值,并且你还存在一个addtime字段保存添加时间,那么你已经在犯错了。因为MongoDB默认的ObjectId本身就保存了一些信息。其中就包括本条记录生成的时间。你只需要通过下面方法就能获取到其中的信息:

> // ObjectId支持的方法
> help misc
        o = new ObjectId()      create a new ObjectId
        o.getTimestamp()        return timestamp derived from first 32 bits of the OID
        o.isObjectId()
        o.toString()
        o.equals(otherid)

5.使用默认_id进行排序

如果使用了默认的ObjectId作为_id值,而你又希望通过insert的时间进行排序查询,那么一切就简单了,你可以直接使用_id字段进行排序,因为它本身是按insert的时间自增生成的。

> // 获取最新加入的10条记录
> db.mycollection.find().sort({id:-1}).limit(10);

参考: http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs

相关 [mongodb objectid 优化] 推荐:

MongoDB ObjectId的优化

- - NoSQLFan
ObjectID,也就是我们在进行insert操作时会自动生成的_id字段. 我们经常会看到它,这个字段的组成及其设计思路我们可以参考NoSQLFan之前的文章《 MongoDB文档(Document)全局唯一ID的设计思路》. 今天我们想讲一下对这个字段的一些优化,内容主要来源于 MongoDB官方文档.

【MongoDB】MongoDB之优化器Profiler

- - CSDN博客数据库推荐文章
在mysql数据库中,慢查询日志经常作为优化数据库的依据, mongodb中依然有类似的功能. Mongodb自带的profiler,可以方便地记录所有耗时的操作,以便于调优;. 一、开始profiler功能. 开启profier功能有两种:. 第一种就是直接在启动参数里面进行设置,就在茄冬mongodb时候添加-profile=级别.

Dex – MongoDB索引优化工具

- - NoSQLFan
Dex是一个开源的MongoDB 优化工具,它通过对查询日志和当前数据库索引进行分析,向管理员提出高效的索引优化策略. 在监控过程中,dex会通过stderr输出推荐的结果. 我们看到,在输出结果中,有一个shellCommand字段,里面就是添加索引的语句,如果你觉得dex的推荐不错,就可以直接复制这段脚本在 MongoDB上添加索引了.

MongoDB智能查询优化的问题

- - NoSQLFan
自动 查询优化是 MongoDB一个专门设计的功能. 简言之,这个功能就是通过对查询进行分析,从而判断出更有利的索引使用策略. 而这个智能的功能,实际潜伏着一些问题. 传统的查询优化是通过对语句进行语义分析来进行索引使用的预判,而MongoDB使用了一种更简单粗暴的方式,对查询的实际执行情况进行分析,它同时执行多条查询,每一条查询使用不同的索引,当其中一条返回时,终止其它的查询,并记录这次的结果,以后会优先使用返回更快的索引.

MongoDB范围查询的索引优化

- - NoSQLFan
我们知道, MongoDB的 索引是B-Tree结构的,和MySQL的索引非常类似. 所以你应该听过这样的建议:创建索引的时候要考虑到sort操作,尽量把sort操作要用到的字段放到你的索引后面. 但是有的情况下,这样做反而会使你的查询性能更低. 比如我们进行下面这样的查询:. 查询条件是 {“country”: “A”},按 carsOwned 字段的正序排序.

开发高性能的MongoDB应用—浅谈MongoDB性能优化 - 吴纹羽

- - 博客园_首页
大数据时代的数据存储,非关系型数据库MongoDB(一).   “如何能让软件拥有更高的性能. ”,我想这是一个大部分开发者都思考过的问题. 性能往往决定了一个软件的质量,如果你开发的是一个互联网产品,那么你的产品性能将更加受到考验,因为你面对的是广大的 互联网用户,他们可不是那么有耐心的. 严重点说,页面的加载速度每增加一秒也许都会使你失去一部分用户,也就是说, 加载速度和用户量是成反比的.

MongoDB MapReduce 性能提升20倍的优化宝典

- - 数据库 - ITeye博客
自从MongoDB被越来越多的大型关键项目采用后,数据分析也成为了越来越重要的话题. 人们似乎已经厌倦了使用不同的软件来进行分析(这都利用到了Hadoop),因为这些方法往往需要大规模的数据传输,而这些成本相当昂贵. MongoDB提供了2种方式来对数据进行分析: Map Reduce(以下简称MR)和聚合框架(Aggregation Framework).

MongoDB 性能优化五个简单步骤

- - ITeye资讯频道
MongoDB 一直是最流行的 NoSQL,而根据 DB-Engines Ranking 最新的排行,时下 MongoDB 已经击败 PostgreSQL 跃居数据库总排行的第四位,仅次于 Oracle、MySQL 和 Microsoft SQL Server,此文中总结了如何对 MongoDB 进行性能调优,本文 系OneAPM工程师编译整理.

[mongodb] java操作mongodb

- - 数据库 - ITeye博客
           //实例化Mongo对象,连接27017端口.                               //连接名为yourdb的数据库,假如数据库不存在的话,mongodb会自动建立. //从Mongodb中获得名为yourColleection的数据集合,如果该数据集合不存在,Mongodb会为其新建立.

夜说mongodb

- Lianhui Wang - NoSQLFan
前两天本站刚刚分享了wordnik使用MongoDB经验的文章:《Wordnik 的 MongoDB 使用经历》,今天又看到一位朋友对这方面做的总结,分享在这里,供大家参考. 赋闲以后很长没有更新博客了,说忙完全是借口,多半因为没有兴致所致. 今天凌晨比赛多多,趁着比赛的前奏和间隙,遂浏览些技术文章.