MongoDB 教程五: MongoDB固定集合和性能优化 (索引Indexes, 优化器, 慢查询profile)

mongodb索引详解(Indexes)

 

索引介绍

索引在mongodb中被支持,如果没有索引,mongodb必须扫描每一个文档集合选择匹配的查询记录。这样扫描集合效率并不高,因为它需要mongod进程使用大量的数据作遍历操作。

索引是一种特殊的数据结构,它保存了小部分简单的集合数据。索引存储了一些特殊字段,并将其排序。

从根本上讲,索引在mongodb中和其他数据库系统是类似的。mongodb规定了索引的集合级别、支持索引任何字段或者子字段在mongodb文档集合中。

 

索引优化查询方案

要考虑数据之间的关系,做查询优化。

创建索引支持常见的面向用户的查询,确保扫描读取文件最小数量。

索引可以优化特定场景中的其它业务的性能。

 
排序返回数据

来看看一个索引的具体例子(其实就相当于我们查询字段一样的)

20140911134927

上图展示了有索引和无索引的查询方式,目测都可以看出效率。

 
大数据查询

当我们使用索引的时候,查询时候根据对应字段在索引中查询,无需将数据加载到内存中,直接扫描索引拿数据。这些大数据查询是非常有效率的。

 

索引类型

MongoDB提供了一些不同的索引类型支持的数据和查询的具体类型

  • Default _id (默认_id索引)所有mongodb默认都有一个_id字段索引,如果我们不指定_id的值会自动生成一个ObjectId值。
    该_id索引是唯一的,并且可以防止客户端对_id字段值相同插入两个。
    # 查询articles集合的索引
    db.articles.getIndexes();
    # 添加titlei字段索引,并且为升序
    db.articles.ensureIndex({title:1});
    #重构索引(慎用)
    db.articles.reIndex();
     

    注意:索引排序规则升序:1,降序-1

  • Single Field (单字段索引)mongodb允许定义单个字段的索引,与default _id一样,只是字段不同。
  • Compound Index (复合索引[多字段索引])mongodb中可以自定多个字段的索引。例如,如果一个复合指标包括{userid:1,score:-1 },索引排序第一的用户名后,在每一个用户标识符值,按得分++倒序++排序。
    {
        "_id": ObjectId(...),
        "item": "Banana",
        "category": ["food", "produce", "grocery"],
        "location": "4th Street Store",
        "stock": 4,
        "type": "cases",
        "arrival": Date(...)
    }
     

    创建方法:

    # 创建item、stock字段的复合索引,并且升序排序
    db.products.ensureIndex( { "item": 1, "stock": 1 } )

     

    注意:Hashed 字段不能创建索引,如果创建将出现错误

    Application Sort Order 使用案例:降序用户名升序时间。

    # 查询结果集中排序
    db.events.find().sort( { username: -1, date: 1 } )
    # 查询结果集中排序
    db.user_scores.find().sort({score:-1,date:-1}).limit(1)
    # 执行相关查询可以看出查询效率大大提高

     

  • MultiKey Index (多键索引)官方文档中给出这样一个案例:
    {
        userid:"marker",
        address:[
            {zip:"618255"},
            {zip:"618254"}
        ]
    
    }
    
    # 创建索引,并将zip升序排列
    db.users.ensureIndex({"address.zip": 1});
    
    # 假如我们做这样的查询
    db.users.find({"addr":{"$in":[{zip:"618254"}]}})
     

    注意:你可以创建 多键复合索引(multikey compound indexes)

  • Geospatial Index (地理空间索引)
    db.places.ensureIndex( { loc : "2dsphere" } )
     
  • Text Indexes (文本索引)文本索引是在2.4版本更新的,提供了文本搜索文档中的集合功能,文本索引包含:字符串、字符数组。使用$text做查询操作。2.6版本 默认情况下使文本搜索功能。在MongoDB 2.4,你需要使文本搜索功能手动创建全文索引和执行文本搜索
    # 创建文本索引 (2.6你就不用这么麻烦了哦)
    db.articles.ensureIndex({content:"text"});
     

    复合索引可以包含文本索引 称为:复合文本索引(compound text indexes),但有限制

    1. 复合文本索引不能包含任何其他特殊索引类型,比如:多键索引(multi-key Indexes)
    2. 如果复合文本索引包含文本索引的键,执行$text查询必须相同查询条件。可能翻译不对原文:
    (If the compound text index includes keys preceding the text index key, to perform a $text search,
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值