在集合A中,每个文档最多包含100个字段。数据库 mongoDB 只允许在单个集合上最多有 64 个索引。
对此集合的查询需要索引。此查询的过滤器或$match
阶段可以使用 100 个字段的任意组合来完成。
即使创建64个索引,最多也只能覆盖64个字段。
问题:
这意味着,如果根据未索引的 36 个字段中的任何一个对查询进行过滤,则必须进行集合扫描才能完成查询。
问题:
是否有替代方法来优化此查询,防止在此查询的所有可能组合中进行集合扫描?
在集合A中,每个文档最多包含100个字段。数据库 mongoDB 只允许在单个集合上最多有 64 个索引。
对此集合的查询需要索引。此查询的过滤器或$match
阶段可以使用 100 个字段的任意组合来完成。
即使创建64个索引,最多也只能覆盖64个字段。
问题:
这意味着,如果根据未索引的 36 个字段中的任何一个对查询进行过滤,则必须进行集合扫描才能完成查询。
问题:
是否有替代方法来优化此查询,防止在此查询的所有可能组合中进行集合扫描?
当烹饪的饭菜无法预测时,您如何购买杂货?- 你不知道。或者你花大量的钱主动购买每一件杂货。
对于薄表(只有几列),可以对要搜索的字段的每个实际组合建立索引。但大多数时候对于大多数表来说这是不可能的。而且几乎总是没有必要。
这是一个不寻常的要求。即使像 Facebook 这样的大型公司(将一个例子与您的其他帖子联系起来)也不会一次搜索这么多领域。当您在搜索框中输入搜索词时,它只会搜索一些固定字段,例如
FirstName
、LastName
、Description
、Tag
等。它不会搜索Birthday
、Age
、Gender
、 等之类的内容。不完全是。单个索引可以一次覆盖多个字段组合。例如,字段上的单个索引将覆盖 only或 on and or 、、 and 上
(FirstName, LastName, Tag)
的谓词。因此,根据实际用途,一个索引可以涵盖多个用例。FirstName
FirstName
LastName
FirstName
LastName
Tag
我知道听起来您得到了很多多余的答案,这些答案似乎并不能帮助您解决最近的每个问题,但这是因为针对特定情况的优化是非常具体的。遗憾的是,您目前提供的通用详细信息只能提供此通用信息。
如果您想提供您拥有的确切用例,包括您正在使用的系统是什么、涉及的对象是什么、它们的结构如何、一些示例数据以及您如何尝试搜索它们,那么也许可以提供一组更具体的优化方法,这些方法可能会围绕设计实现。
我重复一遍:检查你的数据库设计,它真的很糟糕 - 只要相信它!
不管怎样,你说“对此集合的查询需要索引”。是的,确实如此,但这并不意味着您需要在舞台中出现(或可能出现)的每个字段上建立索引
$match
。在最常用或最期望的字段上创建索引。如果单个索引值返回 100 个文档(一千万个文档),那么这仍然非常快。MongoDB 可以在几毫秒内扫描这些内容。
基数低的字段不需要任何索引。无论是否在该字段上建立索引,查询性能都不会改变。例如,典型的低基数是一个
gender
字段,它只有male
和female
(也可能是others
)。此类字段上的索引会浪费磁盘空间,即使它是每个查询的一部分。100 个字段的任意组合给出了大量可能的条件,您永远无法涵盖所有这些条件。只关注前 5 名!