我有一个非常大的文档集合(数亿个文档)
每份文件都是如此
- YYYY/MM/DD 格式的日期
- 姓名
- 类型1
- 类型2
- 价值
有~50个不同的名字,~60个不同的type1,~20个不同的type2
我需要从这个数据库中读取,通常是:
- 一组唯一的 (name,type1,type2),但包含所有日期
- 所有类型的几个日期1
- 项目清单
目前我正在阅读没有任何索引,而且速度很慢!比拥有几个扁平的 sql 表要慢得多......
如何使用索引来加速这个数据库?
谢谢
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
是昂贵的。