mongodb特殊的索引和集合再整理[轉]


  • Lv 1

    mongodb特殊的索引和集合

    • 用于类队列数据的固定集合
    • 用于缓存的TTL索引
    • 用于简单字符串搜索的全文索引
    • 用于二维平面和球体空间的地理空间索引
    • 用于存储大文件的GridFS

    一、固定集合

    mongodb的普通集合是动态创建的,而且可以自动增长以容纳更多的数据。而固定集合需要事先创建好,而且它的大小是固定的,它的行为类似于循环队列。如果已经没有空间了,最老的文档会被删除以释放空间,新插入的文档会占据这块空间,也就是说,当固定集合被占满时,如果再插入新文档,固定集合会自动将最老的文档从集合中删除。固定集合的数据被顺序写入磁盘固定空间,因此它们在碟式磁盘上的写入素服非常快,尤其是集合拥有专用磁盘时,(这样就不会因为其他集合的一些随机写操作而中断)

    固定集合需要注意的事项: 不同于其他集合,固定集合必须事先创建好,才能使用,在创建固定集合的时候可以指定固定集合的大小和允许的最大文档数量,集合大小时必须的,否则会报错。并且固定集合不能进行分片。

    普通集合也可以通过命令转换为固定集合,但是这转化你是单方向的,无法再将固定集合转换为非固定集合

    1. 创建固定集合
      db.createCollection(<集合名称>,{"capped":true,"size":<集合大小>,["max":<文档数量>]})
    2. 将普通集合转换为固定集合
      db.runCommand({"convertToCapped":<集合名称>,"size":<集合大小>,["max":<文档数量>]})
    3. 自然排序 对固定集合可以进行一种特殊的排序,成为自然排序,自然排序返回的结果的顺序就是文档在磁盘上的顺序。对于其它集合来说自然排序意义不大,因为文档的位置经常变化
      db.<固定集合名称>.find(<查询条件>).sort({"$natural":-1})
    4. 循环游标 循环游标是一种特殊的游标,当循环游标的结果集被取光后,游标不会被关闭,循环游标的灵感来自tail -f命令,会尽可能地持续提取输出结果,因为这个特性,当有新文档插入时循环游标会继续取到结果,循环游标只能用在固定集合。
    5. 没有_id索引的集合 默认情况下每个集合都有一个_id索引,但是如果再调用createCollection创建集合时指定autoIndexId选项为false,创建结婚时就不会自动在_id上创建索引。 如果创建一个没有_id索引的结婚,那就永远都不能复制它所在的mongod了,复制操作要求每个集合上都有_id,能够唯一表示集合中每个文档是非常重要的。

    二、TTL索引

    如果需要更加灵活的老化移出系统,可以使用ttl索引,(time-to-live idnex,具有生命周期的索引),可以为每个文档设置一个超时时间。一个文档达到预设值的老化程度之后就会被删除。这种类型的索引对于缓存问题非常有用。

    [hide]

    1.创建一个TTL索引

    db.<集合名称>.ensureIndex({<字段名称>:<排序方向>},{"expireAfterSecs":<秒数>})

    mongodb没分钟对索引进行清理,所以不应该依赖以秒为单位的时间抱枕索引的存活状态,可以使用collMod命令修改expireAfterSecs的值

    db.runCommand({"collMod":<集合名>.<字段名>,"expireAfterSecs":<秒数>})

    三、全文本索引

    全文本索引用于在文档中搜索文本,使用正则表达式搜索大块文本速度非常慢,而且无法处理语言的理解问题。使用全文本索引可以非常快速地进行文本搜索,就如同内置了多种语言分词机制的支持一样。

    创建任何一种索引的开销都比较大,而创建全文索引的成本更高。在一个操作频繁的集合上创建全文本索引可能会导致mongodb过载,所以应该是离线状态下创建全文本索引,或者在对性能没要求时。 创建全文本索引时,内存可能会不够用。 全文索引会导致比普通索引更严重的性能问题,因为所有字符串都要被分解、分词,并保存在一些地方。因此,可能会返现拥有全文索引的集合的写入性能比其他集合要差。全文本索引也会降低分片时数据迁移的熟读,将数据迁移到其他分片时所有文本都要重新进行索引。
    1. 启动全文本索引 启动mongodb服务时指定 --setParameter textSearchEnabled=true 或者在运行时执行setParameter命令。
      //方式一
      mongod --setParameter textSearchEnabled=true
      //方式二
      db.adminCommand({"setParameter":1,"textSearchEnabled":true})
    2. 创建全文本索引
      db.<集合名称>.ensureIndex({<字段名称>:"text"})
    3. 使用全文本索引

      db.<集合名称>.find({$text:{"$search":<搜索内容>}})

      四、地理空间索引

      mongodb支持支持几种类型的地理空间索引。其中最常用的是2dsphere索引(用于地球表面类型的地图)和2d索引(用于平面地图和时间连续的数据)。

      2dsphere允许使用GeoJson格式指定点、线和多边形。点可以用形如

      本帖下載内容已隐藏,请登入以查看隐藏内容!

      [/hide]


  • 註冊用戶

    想看~快給我看~芝麻開門


登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待