我目前正在进行一个项目,使用MongoDB作为具有多个集合的数据库。我最大的收藏在未来可能不会超过10000-15000份文件,目前大约有5500份文件。我使用了8个字段来查询集合。我现在正在寻找一个索引策略。我的问题是,所有8个字段都不是强制性的,可以以不同的组合出现。这让我很难创建复合索引。有人建议如何解决这个问题吗?
我为集合想出了15个复合索引,我认为这些索引涵盖了一些最重要的查询。这些对一个系列来说太多了吗?我还定期从另一个数据源向数据库插入/更新数据,所以我担心写入性能会太慢。用户只执行读取操作。我也不确定索引对于这样"小"的集合是否有意义。对于5500个文档的实际大小,无索引查询大约需要6-8毫秒才能完成。
可能集合太小,无法得到明显的改进。但是,如果该集合预计在未来会增加,它将需要一个索引策略。
MongoDB(和许多其他数据库(支持多列/字段索引,但顺序很重要。例如,如果有3列A、B、C,并且复合索引被创建为(A、B和C(:
- 所有使用A或A+B或A+B+C列的查询都将利用索引
- 其余的查询不会,例如B或C、B+C或A+C
为了允许所有可能的组合,需要几个索引(这相当昂贵(。
但令人惊讶!MongoDB支持为每个文档索引多个值(使用数组(,可以利用这一点并应用名为"的模式;属性模式":https://www.mongodb.com/blog/post/building-with-patterns-the-attribute-pattern
在通过几个字段进行搜索的情况下,每个文档都可能有一个额外的属性(例如"搜索"(,这里有一个例子:
{
"name": "apple",
"kind": "fruit",
"color": "green",
"size": 33,
"search": [
{"k": "name", "v": "apple"},
{"k": "kind", "v": "fruit"},
{"k": "color", "v": "green"},
{"k": "size", "v": 33}
]
}
和一个复合指数CCD_ 1。为了利用该索引,用户查询应该根据以下内容进行调整/重写:
{"name":"apple", "color": "green"}
到此:
{
"$and":[
{"search":{"$elemMatch": {"k": "name", "v": "apple"}}},
{"search":{"$elemMatch": {"k": "color", "v": "green"}}}
]
}
关于$elemMatch
的更多信息https://docs.mongodb.com/manual/reference/operator/query/elemMatch/
这种模式将在包含数亿文档的集合中生成即时查询结果。