MongoDB索引的用途是什么?

MongoDB索引的用途是什么?,mongodb,mongodb-query,Mongodb,Mongodb Query,我有一个mongo集合,其中有数百万个文档具有相同的字段,例如 { "_id" : ObjectId("601ade833126047ee8f47182"), "file_id" : "60110b7dad0cf20001adcbef", "versions" : [ { "local" : 6,

我有一个mongo集合,其中有数百万个文档具有相同的字段,例如

{
    "_id" : ObjectId("601ade833126047ee8f47182"),
    "file_id" : "60110b7dad0cf20001adcbef",
    "versions" : [
        {
            "local" : 6,
            "s3" : "C71rczduuVOPpMohCpCeBQ3_NARDnTRj"
        }
    ]
}
{
    "_id" : ObjectId("60221d1039acf39e09fbfca5"),
    "file__id" : "5fdb2eb4ad0cf20001f97856",
    "versions" : [
        {
            "local" : 2,
            "s3" : "aCy61Gx_UpTZfY59hNLYryGuWTJO2oPk"
        }
    ]
}
{
    "_id" : ObjectId("60221dc639acf39e09fbfca6"),
    "file_id" : "5fe9c897a675f20001f0a82e",
    "versions" : [
        {
            "local" : 3,
            "s3" : "PHLnYjsRlg3GnEQ_UeDkhWIaJbFRmpw9"
        }
    ]
}
{
    "_id" : ObjectId("6050cbcd6b7aab2cd3958978"),
    "file_id" : "6040ca06a675f2000115985e",
    "versions" : [
        {
            "local" : 2,
            "s3" : "vdFY22JFAzU.cD1Xr0eliuwt00rpJC8j"
        }
    ]
}
我的问题是,如果我给出命令
collection.find({“file\u id”:some\u string})
,mongodb必须搜索整个集合才能找到我正在搜索的带有“file\u id”的文档。索引“文件\u id”是否有助于减少执行时间?。在我的情况下,集合中的所有文档都将具有键“file\u id”。在这种情况下,索引真的会有帮助吗?

您问:

索引“file_id”是否有助于减少执行时间

答案很可能是肯定的,将索引添加到
file\u id
字段将大大加快上面显示的查找查询的速度。你自己试试就知道了:

db.your_collection.createIndex( { "file_id": 1 } )

默认情况下,上述命令将使用
文件id
字段值创建B树索引。深入了解B-树的工作原理可能超出了任何单一答案的范围,但总而言之,如果Mongo使用此索引通过
file\u id
进行搜索,它应该执行为
O(lgN)
,其中
N
是集合中的BSON文档数。另一方面,在没有任何索引的情况下按原样运行查询应该会导致完全收集扫描,这应该是一个线性
O(N)
操作。请注意,这比使用索引要慢得多。

感谢您的回答,我的疑问是,我收藏的所有文档都将具有密钥“file\u id”。在这种情况下,即使我建立索引,mongodb也必须搜索整个文档,对吗?。我的理解正确吗?@AjayGanesan如果您在
文件id
上添加索引,那么Mongo应该只需要处理所有文档的一小部分。这假设
file\u id
是一个相对唯一的字段。显然,如果所有文档都有相同的
file\u id
值,那么索引就没有帮助了。在我的例子中,所有文档都有键“file\u id”,但该值对于每个文档都是唯一的。索引现在会有帮助吗?@AjayGanesan阅读了关于,在本例中,这仍然适用于Mongo。是的,如果
file\u id
在整个集合中是一个相当独特的字段,那么索引应该会有所帮助。随着重复值变得越来越普遍,索引的有用性将开始降低。