【问题标题】:Do I need composite indices if each attribute is indexed in mongodb collection?如果每个属性都在 mongodb 集合中编入索引,我是否需要复合索引?
【发布时间】:2013-06-26 11:06:51
【问题描述】:

假设我在 mongo 数据库中有一个包含以下文档的集合

{
    "name" : "abc",
    "email": "abc@xyz.com",
    "phone" : "+91 1234567890"
}

该集合有很多对象(一百万左右),我的应用程序除了定期向该集合添加对象外,还对该数据进行了几种不同类型的查找。

一种方法对所有三个属性(姓名、电子邮件和电话)进行查找,因此我可以为这三个字段创建一个复合索引,以确保此查找有效。

db.mycollection.ensureIndex({name:1,email:1,phone:1})

现在,我的应用程序中还有一些方法可以获取所有具有相同名称的对象(我知道这是个坏例子)。所以我需要一个名称字段的索引。

db.mycollection.ensureIndex({name:1})

逐渐地,我的应用程序增长到必须索引其他字段的地步。

现在,我的问题。如果我将每个属性都单独编入索引,那么为所有三个属性(或两个属性)维护复合索引是否仍然有意义?

显然,这是一个不好的例子...如果我要创建一个集合来存储一个人的多个联系信息,我会使用数组。但是,这个问题纯粹是关于索引的。

【问题讨论】:

标签: mongodb mongodb-indexes


【解决方案1】:

这取决于您的查询。

如果您正在执行以下查询:

db.mycollection.find({"name": "abc", email: "abc@xyz.com", phone: "+91 1234567890"});

那么复合索引将是最有效的。

【讨论】:

  • 是的,我正在做那个查询。这是显而易见的。我的问题是.. 如果我也在做一个查询,我正在搜索 2 个属性或仅一个属性,我也需要为这些查找添加索引。那么我还需要维护复合索引吗?还是我什至需要单独的索引?
【解决方案2】:

只是为了完成而回答我自己的问题:
复合索引并不意味着每个单独的属性都被索引,只有复合索引中的第一个属性可以单独用于高效查找。这个想法是为了平衡和优化查询,因为太多的索引会增加磁盘存储和插入时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2016-07-10
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    相关资源
    最近更新 更多