使用索引来加速mongodb数据库的读取

时间:2013-10-23 09:01:07

标签: mongodb indexing

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

每个文件都是这样的

  • 以YYYY / MM / DD格式的日期
  • 名称
  • TYPE1
  • TYPE2

有大约50个不同的名字,~60种不同的类型1,~20种不同的类型2

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

  1. 一组唯一的(name,type1,type2),但包含所有日期
  2. 所有type1的几个日期
  3. 列表项
  4. 目前我正在阅读而没有任何索引,而且非常慢!比有几个平面sql表慢得多......

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

    感谢

1 个答案:

答案 0 :(得分:1)

  

以YYYY / MM / DD格式的日期

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

  

有大约50个不同的名字,~60种不同的类型1,~20种不同的类型2

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

  

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

  • 一组独特的(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费用昂贵。