`

探究Mongodb的复合索引

 
阅读更多

       最近用mongodb来做一个项目,在看其关于复合索引部分的时候有一个疑惑:
“复合索引同样可用于局部属性的搜索,但必须依照索引字段顺序。比如创建索引字段顺序 "a,b,c",那么仅对 "a,b,c"、"a,b"、"a" 查询有效,而对 "b,c" 之类的组合无效。” 
来源:传说中”雨痕“的博客  http://www.rainsts.net/article.asp?id=1033
       这不是跟mysql的复合索引一致么?真的是这样么?继续对这个问题的探究。
查阅mongodb的官网,有这样一段描述:
New in 1.6+
Now you can also use the compound index to service any combination of equality and range queries from the constitute fields. If the first key of the index is present in the query, that index may be selected by the query optimizer. If the first key is not present in the query, the index will only be used if hinted explicitly. While indexes can be used in many cases where an arbitrary subset of indexed fields are present in the query, as a general rule the optimal indexes for a given query are those in which queried fields precede any non queried fields.
     初读一遍,发现惊喜,1.6+上的新特性? 难道当前的复合索引已经支持任意复合索引的组合子集了么?怀着期待去操作了一把:
首先参看子集的版本是否1.6+:
> db.version()                                                           
1.6.5
然后查看我自己的collections的复合索引:
> db.caption.getIndexes()                                                
[
        {
                "name" : "_id_",
                "ns" : "Caption.caption",
                "key" : {
                        "_id" : 1
                }
        },
        {
                "name" : "movie_longth",
                "ns" : "Caption.caption",
                "key" : {
                        "movieID" : 1,
                        "longth" : 1
                },
                "unique" : false,
                "_id" : ObjectId("4d2d714b4637c31478000001")
        }
]
Ok ,现在尝试只用复合索引中的后一字段longth来查询:
> db.caption.find({longth:{$lt:20}}).explain()                  
{
        "cursor" : "BasicCursor",
        "nscanned" : 5,
        "nscannedObjects" : 5,
        "n" : 2,
        "millis" : 0,
        "indexBounds" : {

        }
}
失望,并没有期望中的使用到索引。
尝试查询longth,以movieID排序:
> db.caption.find({longth:{$lt:20}}).sort({movieID:1}).explain()
{
        "cursor" : "BtreeCursor movie_longth",
        "nscanned" : 2,
        "nscannedObjects" : 2,
        "n" : 2,
        "millis" : 0,
        "indexBounds" : {
                "movieID" : [
                        [
                                {
                                        "$minElement" : 1
                                },
                                {
                                        "$maxElement" : 1
                                }
                        ]
                ],
                "longth" : [
                        [
                                -1.7976931348623157e+308,
                                20
                        ]
                ]
        }
}
就是说放过来仍然是能够用到索引的。
nice,验证想法应该可以对任意子集生效的。再次细读官网的说明,发现重点:
” If the first key of the index is present in the query, that index may be selected by the query optimizer. If the first key is not present in the query, the index will only be used if hinted explicitly. “
意思是说如果第一键出现默认是能被优化器用到index的,如果第一键未出现,但还是可以显示指定使用组合索引的,遂继续尝试:
> db.caption.find({longth:{$lt:20}}).hint({movieID:1,longth:1}).explain()
{
        "cursor" : "BtreeCursor movie_longth",
        "nscanned" : 2,
        "nscannedObjects" : 2,
        "n" : 2,
        "millis" : 0,
        "indexBounds" : {
                "movieID" : [
                        [
                                {
                                        "$minElement" : 1
                                },
                                {
                                        "$maxElement" : 1
                                }
                        ]
                ],
                "longth" : [
                        [
                                -1.7976931348623157e+308,
                                20
                        ]
                ]
        }
}
这样总算可以让复合索引被任意子集所使用上了。

     通过这个小细节的测试和探究,得出一个结论:当我们在网络上查阅资料时,请注意出处以及时间,特别是开源的内容,开源力量不断壮大,更新也是非常迅速,可能的老规则已经有新的替代;非常感谢雨痕的分享让大家熟悉了解到mongodb的使用,但从其文章的时间来看是2010-07,那个时候mongodb的版本还在1.4.5-, 而当前已经在12/9/2010发布了1.6.5。
      也给自己在平时做项目使用开源内容的时候多了一份提示:多跟进官网的资料,update新特性。

 

http://johnnychenjun.blog.163.com/blog/static/1374934062011012103129303/

分享到:
评论

相关推荐

    MONGODB的索引探究

    MongoDB的索引是数据库性能优化的关键因素,与MySQL、Oracle等关系型数据库中的索引原理相似,但具有自身的特性和限制。MongoDB的索引建立在Collection(表)级别,采用B-树数据结构来加速查询和排序操作。 1. 默认...

    MongoDB数据库索引介绍.pptx

    MongoDB 数据库索引介绍 MongoDB 数据库索引是提高查询性能和减少查询时间的重要手段。索引可以告诉 MongoDB 如何高效地检索数据,以便快速地找到所需的数据。在本文中,我们将深入探讨 MongoDB 数据库索引的基础...

    深入理解MongoDB的复合索引

    当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下MongoDB里的索引机制(同样适用于其他的数据库比如mysql)。 mongo-9552:PRIMARY> db.person.find() { "_id" : ...

    基于MongoDB数据库索引构建情况全面分析

    MongoDB数据库索引是提升查询效率的关键因素,它允许快速访问和排序数据,尤其是在处理大量数据时。然而,建立和维护索引也会带来一定的成本,包括磁盘空间占用和写入操作的性能损失。因此,对MongoDB数据库索引构建...

    MongoDB简单索引.pdf

    除了单字段索引,`ensureIndex()`方法也支持创建复合索引,即基于多个字段的索引。例如,`db.col.ensureIndex({"title":1,"description":-1})`会在`title`字段上创建升序索引,并在`description`字段上创建降序索引...

    NoSQL数据库(如MongoDB,Cassandra):MongoDB的索引与性能优化.docx

    NoSQL数据库(如MongoDB,Cassandra):MongoDB的索引与性能优化.docx

    MongoDB-索引

    查询时,至少需要包含复合索引的前几个字段,顺序可以不同,MongoDB 会自动调整。 5. 内嵌文档索引:对于内嵌文档,如 "comments.date",也可以创建索引: ``` db.test.ensureIndex({"comments.date":1}) ``` ...

    MongoDB索引限制.pdf

    - **复合索引字段数**:一个复合索引最多可以包含 31 个字段,这限制了复杂查询的组合可能性。 理解并遵循这些限制有助于优化 MongoDB 集群的性能和稳定性。在设计数据库架构和索引策略时,应该充分考虑这些因素,...

    MongoDB覆盖索引查询.pdf

    MongoDB 覆盖索引查询是一种优化查询性能的技术,尤其适用于需要高效检索和返回大量数据的场景。在MongoDB中,覆盖索引查询是指查询涉及的所有字段都包含在创建的索引中,这样MongoDB就无需回表(即不需访问原始文档...

    MongoDB学习笔记(六) MongoDB索引用法和效率分析

    MongoDB是一种流行的NoSQL数据库,它的索引机制与传统的关系型数据库类似,旨在提升查询和排序的速度。在MongoDB中,索引对于优化查询性能至关重要,尤其在处理大量数据时。下面将详细介绍MongoDB中不同类型的索引...

    MongoDB中唯一索引(Unique)的那些事

    MongoDB支持的索引种类很多,诸如单键索引,复合索引,多键索引,TTL索引,文本索引,空间地理索引等。同时索引的属性可以具有唯一性,即唯一索引。唯一索引用于确保索引字段不存储重复的值,即强制索引字段的唯一性...

    MongoDB TTL索引的实例详解

    其次,TTL索引不支持基于多个字段的复合索引。最后,定长集合不支持TTL索引。 在实际应用中,可以通过编写脚本或使用MongoDB shell来创建和测试TTL索引。例如,以下脚本创建了一个名为`tltTest`的集合,并插入了三...

    五、MongoDB 学习PPT

    MongoDB 是一种流行的开源NoSQL数据库,以其面向文档的数据模型、高性能、高可用性和高可扩展性而闻名。它的设计目标是提供一个灵活且可扩展的解决方案,特别适合处理大量结构化和半结构化的数据。 在MongoDB中,...

    MongoDB命名索引和唯一索引.pdf

    本篇将详细解释 MongoDB 中的命名索引和唯一索引。 1. 命名索引 命名索引允许用户为创建的索引指定一个自定义的名称,这有助于管理和识别数据库中的不同索引。在 MongoDB 中,你可以使用 `ensureIndex()` 方法来...

    计算机后端-PHP视频教程. mongodb07 索引.wmv

    计算机后端-PHP视频教程. mongodb07 索引.wmv

    MongoDB高级索引.pdf

    本文将深入探讨如何在 MongoDB 中为数组字段和子文档字段创建高级索引,以优化查询性能。 首先,让我们了解一下在数组字段上创建索引的方法。在上述示例中,`tags` 字段是一个数组,包含字符串如 "music", "cricket...

    MongoDB 覆盖索引查询

    MongoDB的覆盖索引查询是一种优化查询性能的技术,它的核心在于通过索引来满足查询的全部需求,从而避免了对整个文档的访问。这种查询方法在处理大数据量时尤其有用,因为它减少了磁盘I/O操作,提高了查询速度。下面...

    深入探究MongoDB:从基础到实战,一个全面的指南

    MongoDB是一种流行的NoSQL数据库,它的特点是采用灵活的文档型数据模型,这使得它能够适应非结构化的数据处理。MongoDB的数据模型以JSON对象为基础,每个记录由一系列字段和值对组成,允许不同文档在同一个集合中...

Global site tag (gtag.js) - Google Analytics