MongoDB索引使用

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

提升数据库检索性能的手段

通过getIndexes()来获取已经存在的索引内容

db.students.getIndexes();
/* 1 */
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "mldn.students"
    }
]

创建自己的索引

范例:创建一个索引,在age列加一个将序索引

db.students.ensureIndex({"age":-1});
/* 1 */
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "mldn.students"
    },
    {
        "v" : 1,
        "key" : {
            "age" : -1.0
        },
        "name" : "age_-1",
        "ns" : "mldn.students"
    }
]

使用解释来分析索引

db.students.find({"age":19}).explain();
/* 1 */
{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "mldn.students",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "age" : {
                "$eq" : 19.0
            }
        },
        "winningPlan" : {
            "stage" : "FETCH",
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "age" : -1.0
                },
                "indexName" : "age_-1",
                "isMultiKey" : false,
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 1,
                "direction" : "forward",
                "indexBounds" : {
                    "age" : [ 
                        "[19.0, 19.0]"
                    ]
                }
            }
        },
        "rejectedPlans" : []
    },
    "serverInfo" : {
        "host" : "jiqing",
        "port" : 27017,
        "version" : "3.2.17-25-gae6f04a",
        "gitVersion" : "ae6f04a7cd143132fb3185669a8abc5d7c4ab3cc"
    },
    "ok" : 1.0
}

再分析一个没有索引的成员

db.students.find({"score":{"$gt":80}}).explain();
/* 1 */
{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "mldn.students",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "score" : {
                "$gt" : 80.0
            }
        },
        "winningPlan" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "score" : {
                    "$gt" : 80.0
                }
            },
            "direction" : "forward"
        },
        "rejectedPlans" : []
    },
    "serverInfo" : {
        "host" : "jiqing",
        "port" : 27017,
        "version" : "3.2.17-25-gae6f04a",
        "gitVersion" : "ae6f04a7cd143132fb3185669a8abc5d7c4ab3cc"
    },
    "ok" : 1.0
}

有索引和没索引的成员一起使用呢?

db.students.find({"$and":[
        {"age":{"$gt":19}},
        {"score":{"$gt":80}}
    ]}).explain();

and的时候用到了索引,or的时候没有用到。

可以定义复合索引

db.students.ensureIndex({"age":-1,"score":-1},{"name":"age_score_index"});
/* 1 */
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "mldn.students"
    },
    {
        "v" : 1,
        "key" : {
            "age" : -1.0
        },
        "name" : "age_-1",
        "ns" : "mldn.students"
    },
    {
        "v" : 1,
        "key" : {
            "age" : -1.0,
            "score" : -1.0
        },
        "name" : "age_score_index",
        "ns" : "mldn.students"
    }
]

强制使用索引

db.students.find({"$or":[
        {"age":{"$gt":19}},
        {"score":{"$gt":80}}
    ]}).hint({"age":-1,"score":-1}).explain();

删除索引

db.students.dropIndex({"age":-1,"score":-1});

删除全部索引,但是不会删除主键索引

db.students.dropIndexes();

唯一索引

主要的目的是使得某个字段上的内容不重复。

范例:创建一个唯一索引

db.students.ensureIndex({"name":1},{"unique":true});
/* 1 */
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "mldn.students"
    },
    {
        "v" : 1,
        "unique" : true,
        "key" : {
            "name" : 1.0
        },
        "name" : "name_1",
        "ns" : "mldn.students"
    }
]

这个时候如果插入的姓名已存在,将会报错。

E11000 duplicate key error collection: mldn.students index: name_1 dup key: { : "张三" }

过期索引

用于手机验证码之类的与时间期限的数据。

db.phones.ensureIndex({"time":1},{expireAfterSeconds:10});


db.phones.insert({"tel":"110","code":"110","time":new Date()});
db.phones.insert({"tel":"111","code":"111","time":new Date()});
db.phones.insert({"tel":"112","code":"112","time":new Date()});
db.phones.insert({"tel":"113","code":"113","time":new Date()});
db.phones.insert({"tel":"114","code":"114","time":new Date()});
db.phones.insert({"tel":"115","code":"115","time":new Date()});
db.phones.insert({"tel":"116","code":"116","time":new Date()});
db.phones.insert({"tel":"117","code":"117","time":new Date()});

设置过期时间10秒,但是会有延迟。时间到了后,会删除。

全文索引

db.news.insert({"title":"aaa","content":"啦啦啦"});
db.news.insert({"title":"bbb","content":"乐乐乐"});
db.news.insert({"title":"ccc","content":"咕咕咕"});
db.news.insert({"title":"ddd","content":"噜噜噜"});
db.news.insert({"title":"eee","content":"驴驴驴"});
db.news.insert({"title":"abc","content":"啦乐噜"});
db.news.ensureIndex({"title":"text","content":"text"});

地理索引

插入数据

db.shop.insert({loc:[10,10]});

db.shop.insert({loc:[11,10]});

db.shop.insert({loc:[10,11]});

db.shop.insert({loc:[12,15]});

db.shop.insert({loc:[16,17]});

db.shop.insert({loc:[90,90]});

db.shop.insert({loc:[120,130]});

范例: 为shop的集合定义2D索引

db.shop.ensureIndex({"loc":"2d"});

near,geoWithin

范例:查询[11,11]附近的点

db.shop.find({"loc":{"$near":[11,11]}});

默认返回100条

db.shop.find({"loc":{"$near":[11,11],"$maxDistance":5}});




本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/7866150.html,如需转载请自行联系原作者
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
27天前
|
存储 NoSQL MongoDB
掌握MongoDB索引优化策略:提升查询效率的关键
在数据库性能调优中,索引是提升查询效率的利器。本文将带你深入了解MongoDB索引的内部工作原理,探讨索引对查询性能的影响,并通过实际案例指导如何针对不同的查询模式建立有效的索引。不仅将涵盖单一字段索引,还会探讨复合索引的使用,以及如何通过分析查询模式和执行计划来优化索引,最终实现查询性能的最大化。
|
3月前
|
监控 NoSQL MongoDB
MongoDB数据库的索引管理技巧
【8月更文挑战第20天】MongoDB数据库的索引管理技巧
67 1
|
6天前
|
存储 NoSQL 关系型数据库
MongoDB索引知识
MongoDB索引知识
11 1
MongoDB索引知识
|
4月前
|
NoSQL Java API
MongoDB 强制使用索引 hint
MongoDB 强制使用索引 hint
130 3
|
12天前
|
存储 NoSQL MongoDB
MongoDB 索引限制
10月更文挑战第22天
25 2
|
12天前
|
NoSQL MongoDB 索引
MongoDB 高级索引
10月更文挑战第22天
22 2
|
5月前
|
存储 监控 NoSQL
MongoDB索引解析:工作原理、类型选择及优化策略
MongoDB索引解析:工作原理、类型选择及优化策略
|
16天前
|
NoSQL MongoDB 索引
MongoDB 覆盖索引查询
10月更文挑战第21天
21 1
|
21天前
|
存储 NoSQL MongoDB
MongoDB 索引
MongoDB 索引
29 3
|
5月前
|
NoSQL 定位技术 MongoDB
深入探索 MongoDB:高级索引解析与优化策略
深入探索 MongoDB:高级索引解析与优化策略
151 1
下一篇
无影云桌面