MongoDB 中的复合索引是不是改进了多重匹配(而不是排序)?

Posted

技术标签:

【中文标题】MongoDB 中的复合索引是不是改进了多重匹配(而不是排序)?【英文标题】:does a compound index in MongoDB improve multified match (not sorting)?MongoDB 中的复合索引是否改进了多重匹配(而不是排序)? 【发布时间】:2015-11-09 02:35:38 【问题描述】:

文档似乎对此有点不清楚。

1) 它明确指出复合索引确实可以提高多字段排序的性能(取决于顺序和方向)。

2) 有一句话让我觉得它会提高多字段 MACH(sql 类比:其中 a=1 and b=2 and c

https://docs.mongodb.org/v3.0/tutorial/optimize-query-performance-with-indexes-and-projections/

如果查询搜索多个字段,请创建复合索引。

它没有说明排序。

那么字段 a、b、c 上的复合索引是否比三个单字段索引(其中 a=1 和 b=2 和 c

【问题讨论】:

好吧,我做了一些解释(),发现它确实比单字段查询更喜欢无排序查询中的复合索引 一般来说,在咨询实际收藏之前匹配的越多越好。当然也有例外,但它们通常适用于跨数据库,即在 SQL 和 MongoDB 中同样适用。 【参考方案1】:

是的,创建复合索引可以提高查询性能。

如果所有查询都使用相同的单键,则创建单键索引

如果对于特定集合,您使用单个键进行匹配,例如 where a=1

创建复合索引以支持多个不同的查询

如果您的查询使用一个或多个键,最好使用复合索引。

db.sample.createIndex(  "a": 1, "b": 1, "c":1  )

可以只查询a,可以查询a和b的组合,也可以查询a、b和c。您可以使用 explain() 方法来了解您的查询正在使用什么计划。

Index Intersection 还可以优化查询的性能。它可以支持复合索引无法支持的内容。

【讨论】:

"可以支持复合索引不能支持的。"索引交叉实际上支持的不是复合索引,例如匹配和排序,而且它实际上不是比专门设计的索引慢得多吗? @Sammaye 你是对的,当匹配键与排序键不同时,索引交集不起作用。因为列表顺序和排序顺序在复合索引中都很重要,复合索引可能不支持不包含索引前缀键或指定不同排序顺序的查询条件,但在这种情况下,索引交集效果很好。跨度> 嗯...你知道,这样的细节是不是太麻烦了,让基本的搜索工作?我开始考虑不使用 mongo 进行任何类型的搜索,并将此功能移至运行 Sphinx 的专用主机。我真的希望(并且基于我不是很大的经验)我能够在不涉及如此复杂的细节的情况下获得良好的查询性能。你说什么? @user1312695 这很复杂?这是每个 db 用户都应该知道的标准内容,即使在 Sphinx 中也是如此。如果您不了解存储技术的全部性质,就无法进行有效的查询 @user1312695 因为 a.b 是 a,b,c,d 的前缀 a,b,c,d 的单个复合索引就足够了

以上是关于MongoDB 中的复合索引是不是改进了多重匹配(而不是排序)?的主要内容,如果未能解决你的问题,请参考以下文章

具有稀疏复合索引的 MongoDB $near 地理空间查询错误 13311

MongoDB复合索引详解

MongoDB + C#:未选择/使用 GUID 字段上的复合索引

Mongodb 索引

MongoDB索引,是不是可以同时创建普通和复合?

何时对 mongodb 中的多个键进行索引