带有可选字段的 MongoDB 索引
Posted
技术标签:
【中文标题】带有可选字段的 MongoDB 索引【英文标题】:MongoDB Indexing with optional fields 【发布时间】:2021-07-09 21:27:20 【问题描述】:我目前正在从事一个项目,我使用 MongoDB 作为具有多个集合的数据库。我最大的收藏未来可能不会超过 10000-15000 个文档,目前大约有 5500 个文档。我使用 8 个字段来查询集合。我现在正在寻找一种索引策略。我的问题是所有 8 个字段都不是强制性的,并且可以以不同的组合出现。这让我很难创建复合索引。有没有人建议如何解决这个问题?
我为该集合提出了 15 个复合索引,我认为这些索引涵盖了一些最重要的查询。这些对于一个集合来说太多了吗?我还定期从另一个数据源向数据库插入/更新数据,所以我担心会降低写入性能。用户只执行读取操作。我也不确定索引对于这种相当“小”的集合是否有意义。对于 5500 个文档的实际大小,非索引查询大约需要 6-8 毫秒才能完成。
【问题讨论】:
【参考方案1】:可能该集合太小而无法获得显着改进。但是,如果预计将来会增加该集合,则需要一个索引策略。
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
]
还有一个复合索引(search.k, search.v)
。为了利用该索引,用户查询应该从这个改编/重写:
"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/
此模式将在包含数亿个文档的集合中生成即时查询结果。
【讨论】:
以上是关于带有可选字段的 MongoDB 索引的主要内容,如果未能解决你的问题,请参考以下文章