当前位置: 首页 > 知识库问答 >
问题:

mongodb复合索引与索引相交

扶开诚
2023-03-14

跨碎片的集合中将有大约30亿个文档。假设我将使用不完全由索引(es)实现的查询。我也不是用键来排序的。

具有如下索引(与查询匹配)是否有意义:

{"sid":1, "cid":1, "mid":1}
{"cid":1, "hid":1, "mid":1}
{"mid":1, "hid":1, "sid":1}
{"hid":1, "sid":1, "cid":1, "mid":1}
{"mid":1, "cid":1}
{"mid":1, "sid":1}

或者:

{sid:1}
{cid:1}
{hid:1}
{mid:1} 

共有1个答案

柴琦
2023-03-14

这是一个有效的问题。您没有使用这些键进行排序,因此我将假设您的查询不包含排序,因为您必须知道(已经说过您所做的)索引分段间不能跨排序工作。

我会说:最好是复合索引。

尽管需要维护更多的索引,但它可以直接回答您的查询,而无需进行分段间所需的有问题的计算。我的意思是,你做了超过35亿的记录,这不会有好的结果。

复合索引方法将维护的权重放在插入/更新端,这比查询端要好得多。即使索引在任何给定时间点只完成部分查询也是如此。

似乎Mongodbs的相交得到了更高级的:

一般情况下,每个索引交集涉及两个索引;但是,MongoDB可以使用多/嵌套索引交叉来解析查询。

http://docs.mongodb.org/manual/core/index-intersection/

因此,即使它可以使用两个以上的索引,使用3个交叉点仍然会导致嵌套交叉点的发生,这听起来并不愉快。

前一段时间,我确实回答了一个类似的问题,根据10Gen的说法,区间分割本质上是最后的手段,而不是可取的。

 类似资料:
  • 我在MongoDB有一个收藏,里面有以下文档。 现在,我尝试使用以下查询查询一些文档。 根据我的理解,由于\u id是一个复合字段,并且Mongo总是在\u id上维护一个索引,因此要回答上述查询,Mongo应该在“\u id”上使用索引。然而,上述问题的答案如下: 可以观察到,MongoDB正在对DB进行一次完整的扫描,以查找少量文档。我不知道这里到底怎么了。 我试图改变查询的顺序,但结果相同。

  • 主要内容:createIndex() 方法,dropIndex() 方法,dropIndexes() 方法,getIndexes() 方法索引是特殊的数据结构,存储在一个方便遍历和读取的数据集合中。索引在任何数据库中都非常重要,通过使用索引,可以大大提高查询语句的执行效率。 举个简单的例子,假如您有一个集合,其中包含了数千甚至上万个没有索引的文档,当我们在集合中查找某个文档时,MongoDB 需要扫描整个集合来寻找所需的文档,这种扫描效率极低,特别是在处理大量的数据时,可能需要花费几十秒甚至几分

  • 本文向大家介绍MongoDB的索引,包括了MongoDB的索引的使用技巧和注意事项,需要的朋友参考一下 1、简介 它就像是一本书的目录,如果没有它,我们就需要对整个书籍进行查找来获取需要的结果,即所说的全盘扫描; 而有了目录(索引)之后就可以通过它帮我们定位到目标所在的位置,快速的获取我们想要的结果。 2、演示 第一步,向用户集合users中插入100W条数据 LZ的渣渣I3和4G内存总共耗时了4

  • 问题内容: 我在MySQL数据库中有下表: SQL将如下所示: 如您所见,我同时创建了primaryId和和imgDate索引键。我的想法是,该WHERE子句使用primaryId,而ORDER子句使用来查询结果imgDate。 我的问题是,现在使用多索引会更好吗?还是我应该使用多列索引(目前我不太了解)? 这是我从EXPLAIN得到的: 注意:这不是使用多列索引,这是使用上表说明的结果。 问题答

  • 主要内容:索引数组字段,索引子文档字段假如在 users 集合中插入以下文档: 在上面的文档中包含了一个名为 address 的子文档和一个名为 tags 的数组。 索引数组字段 假设要想根据集合内 tags 字段中的某个值来搜索用户文档,就需要我们为集合中的 tags 字段创建索引。想要在数组类型的字段上创建索引,需要为数组中的每个字段依次创建单独的索引。 在下面的示例中,当我们在 tags 字段上创建索引时,MongoDB 会自动

  • 问题内容: 我想知道Elasticsearch是否需要先定义复合索引。通过复合索引,我的意思是像mongodb一样。 db.collection.ensureIndex({field1:1,field2:1,field3:1}) 或类似mysql db的东西。 在mytable(field1,field2,field3)上创建索引adhoc_index; 所以我要处理的数据非常平坦(大多数只是cs

  • 我想知道elasticsearch是否需要定义一个优先级的复合索引。通过复合索引,我的意思是像mongoDB一样的东西。 db.collection.ensure索引 或者类似mysql db的功能。 在mytable上创建索引adhoc_index(field 1, field 2, field 3); 因此,我处理的数据非常简单(大部分只是csv格式)。为完整起见,如下所示。 字段1,字段2。

  • 问题内容: 我不了解pymongo和pymongo之间的区别。在MongoDB索引页面上,它说 您可以通过调用 但是在pymongo中,有两个不同的命令和,创建索引的文档包括: 与create_index()尝试无条件创建索引的方法不同,sure_index()利用驱动程序中的某些缓存,以便仅尝试创建可能不存在的索引。当PyMongo创建(或确保)索引时,将在ttl秒内“记住”该索引。在此期限内重