【问题标题】:use indexing to speed up reading from mongodb database使用索引来加快读取 mongodb 数据库的速度
【发布时间】:2013-10-23 18:04:52
【问题描述】:

我有一个非常大的文档集合(数亿个文档)

每个文档都是这样的

  • YYYY/MM/DD 格式的日期
  • 姓名
  • type1
  • 类型2
  • 价值

有 ~50 个不同的名称,~60 个不同的 type1,~20 个不同的 type2

我需要从这个数据库中读取,通常是:

  1. 一组唯一的 (name,type1,type2),但包含所有日期
  2. 所有类型 1 的几个日期
  3. 列表项

目前我正在阅读没有任何索引,而且速度很慢!比拥有几个扁平的 sql 表要慢得多...

如何使用索引来加速这个数据库?

谢谢

【问题讨论】:

  • 所以?创建几个索引来支持您的查询。我不明白问题出在哪里。

标签: mongodb indexing


【解决方案1】:

YYYY/MM/DD 格式的日期

有 MongoDB 日期时间格式。用它。它使用的内存比字符串少,并且不需要额外的约定。从某种意义上说,您的格式是合理的,它的字典顺序等同于 0001-01-01 和 9999-12-31 之间日期的时间顺序,但内置数据类型绝对更适合范围查询。

有 ~50 个不同的名称,~60 个不同的 type1,~20 个不同的 type2

您的键的选择性非常低,因此单个索引可能毫无意义

我需要从这个数据库中读取,通常是:

  • 一组独特的(name,type1,type2),但包含所有日期

{name, type1, type2} 使用复合索引。如果您还需要按时间顺序排列,您可能需要添加 date 进行排序或使用像 ObjectId 这样的单调主键并依赖自然顺序。

db.collection.ensureIndex({'name' : 1, 'type1' : 1, 'type2' : 1, 'date' : 1});
  • 所有type1的几个日期

什么是“几个日期”?我假设您的意思是“给定日期范围内的所有日期”?使用date 的索引。 date 自然应该有更好的选择性,所以单独的键是有意义的。

db.collection.ensureIndex({'date' : 1});
  • 列表项

列出所有项目?有订购吗?你需要更具体的东西。请记住,skip/take 很昂贵。

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    • 2016-02-01
    • 2012-05-24
    • 2014-01-26
    相关资源
    最近更新 更多