`
风过无声
  • 浏览: 88598 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

MongoDB 索引

 
阅读更多

初始化数据

var names = [""];
for (var i = 0; i < 100; i++) {
	var user = {
		"id": i,
		"name": "路人甲" + i%10,
		"age": i%50,
		"bestFriend": {
			"name": "路人甲" + (i+1)%10
		}
	};
	db.user.insert(user);
}

1.使用

1)创建

db.collection.ensureIndex(keypattern[,options]);

e.g.

//普通索引,1升序,-1降序
db.user.ensureIndex({"name": 1});
//联合索引
db.user.ensureIndex({"age": 1, "name": 1});
//内嵌文档索引
db.user.ensureIndex({"bestFriend.name": 1});

--索引名称

默认情况下,索引名为keyname1_dir1_..._keynameN_dirN,e.g. age_1_name_1。可以在options中指定索引名称。e.g.

db.user.ensureIndex({"age": 1, "name": 1}, {"name": "idx_age_name"});

2)创建索引时要考虑的问题

--会做什么样的查询,其中哪些键需要索引

--每个键的索引方向是怎样的

--如何应对扩展,有没有不同的键的排列可以使常用数据更多地保留在内存中

3)options唯一索引unique,消除重复dropDups

//唯一索引
db.user.ensureIndex({"id": 1}, {"name": "idx_id", "unique": true});
//唯一索引,存在重复,报错
db.user.ensureIndex({"name": 1, "age": 1}, {"name": "idx_name_age", "unique": true});
//唯一索引,存在重复,保留发现的第一个文档,删除其它有重复值的文档
db.user.ensureIndex({"name": 1, "age": 1}, {"name": "idx_name_age", "unique": true, "dropDups": true});

4)options后台创建索引background

db.user.ensureIndex({"name": 1, "age": 1}, {"background": true});

可以在创建索引的时候正常处理请求。否则,数据库将会阻塞建立索引期间的所有请求。

5)删除索引

db.runCommand({"dropIndexes": "user", "index": "idx_name_age"});

2.索引管理

索引的元数据信息存储在每个数据库的system.indexes集合中。这是一个保留集合,不能对其插入或者删除文档。操作只能通过ensureIndex和dropIndexes进行。

除此之外,每个数据库的system.namespaces集合也包含有索引的名字。

3.explain和hint

1)explain:用于获取查询的相关信息

db.user.find().explain();
{
        "cursor" : "BasicCursor",
        "isMultiKey" : false,
        "n" : 50,
        "nscannedObjects" : 50,
        "nscanned" : 50,
        "nscannedObjectsAllPlans" : 50,
        "nscannedAllPlans" : 50,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 0,
        "indexBounds" : {

        },
        "server" : "SIYUAN-PC:27017"
}

db.user.find({"name": "路人甲"}).explain();
{
        "cursor" : "BtreeCursor name_1_age_1",
        "isMultiKey" : false,
        "n" : 0,
        "nscannedObjects" : 0,
        "nscanned" : 0,
        "nscannedObjectsAllPlans" : 0,
        "nscannedAllPlans" : 0,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 0,
        "indexBounds" : {
                "name" : [
                        [
                                "路人甲",
                                "路人甲"
                        ]
                ],
                "age" : [
                        [
                                {
                                        "$minElement" : 1
                                },
                                {
                                        "$maxElement" : 1
                                }
                        ]
                ]
        },
        "server" : "SIYUAN-PC:27017"
}

--cursor:查询是否使用索引

--n:返回文档的数量

--nscanned:数据库查找了多少个文档

--millis:数据库执行查询的时间

更多字段解析请查看 http://docs.mongodb.org/manual/reference/method/cursor.explain/

2)hint:强制使用某个索引

//hint中指定的索引必须存在,否则会报错
db.user.find().hint({"name": 1}).explain();
Fri Mar 14 17:22:16.882 error: { "$err" : "bad hint", "code" : 10113 } at src/mongo/shell/query.js:128

db.user.find().hint({"name": 1, "age": 1}).explain();
{
        "cursor" : "BtreeCursor name_1_age_1",
        "isMultiKey" : false,
        "n" : 50,
        "nscannedObjects" : 50,
        "nscanned" : 50,
        "nscannedObjectsAllPlans" : 50,
        "nscannedAllPlans" : 50,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 0,
        "indexBounds" : {
                "name" : [
                        [
                                {
                                        "$minElement" : 1
                                },
                                {
                                        "$maxElement" : 1
                                }
                        ]
                ],
                "age" : [
                        [
                                {
                                        "$minElement" : 1
                                },
                                {
                                        "$maxElement" : 1
                                }
                        ]
                ]
        },
        "server" : "SIYUAN-PC:27017"
}

4.地理空间索引

地理空间索引对应的键的值必须是某种形式的一对值:一个包含两个元素的数组或是包含两个键的内嵌文档,e.g.

"gps": [100, 100]
"gps": {"x": 50, "y": 50}
"gps": {"latitude": -50, "longitude": -50}

默认情况下,地理空间索引值的范围是-180~180,可以通过ensureIndex的选项来指定范围,e.g.

db.shop.insert({"name": "真功夫", "gps": [100, 100], "categories": ["餐饮", "外卖"]});
db.shop.insert({"name": "KFC", "gps": {"x": 50, "y": 50}, "categories": ["餐饮", "外卖"]});
db.shop.insert({"name": "小肥羊", "gps": {"latitude": -50, "longitude": -50}, "categories": ["餐饮", "火锅"]});
//创建索引
db.shop.ensureIndex({"gps": "2d"});
//报错,
db.shop.insert({"name": "沃尔玛", "gps": [200, -50], "categories": ["超市"]});
//创建索引
db.runCommand({"dropIndexes": "shop", "index": "gps_2d"});
db.shop.ensureIndex({"gps": "2d"}, {"min": -1800, "max": 1800});
//报错,
db.shop.insert({"name": "沃尔玛", "gps": [200, -50], "categories": ["超市"]});

--查询:由近及远排序

db.shop.find({"gps": {"$near": [40, 40]}});
db.runCommand({"geoNear": "shop", near: [40, 40]});

--查找指定方位形状内的文档

//矩形
db.shop.find({"gps": {"$within": {"$box": [[40, 40], [60, 60]]}}});
//圆
db.shop.find({"gps": {"$within": {"$center": [[40, 40], 20]}}});

 

分享到:
评论

相关推荐

    MongoDB索引管理与高级索引.pdf

    MongoDB索引管理与高级索引.pdf 学习资料 复习资料 教学资源

    MongoDB索引优化与管理-刘诚杰 天痕

    MongoDB索引优化与管理-刘诚杰 天痕,介绍 1. 索引概念 2. 索引优化 3. 执行计划 4. 索引管理

    MongoDB索引限制.pdf

    MongoDB索引限制.pdf 学习资料 复习资料 教学资源

    MongoDB索引管理.pdf

    MongoDB索引管理.pdf 学习资料 复习资料 教学资源

    Mongodb索引的优化

    MongoDB索引几乎和关系型数据库的索引一样.MongoDB的查询优化器能够使用这种数据结构来快速的对集合(collection)中的文档(collection)进行寻找和排序.准确来说,这些索引是通过B-Tree索引来实现的。在命令行中,可以...

    MongoDB索引与查询.pdf

    MongoDB索引与查询.pdf 学习资料 复习资料 教学资源

    MongoDB索引的创建docx.pdf

    MongoDB索引的创建docx.pdf 学习资料 复习资料 教学资源

    SpringBoot MongoDB 索引冲突分析及解决方法

    主要介绍了SpringBoot MongoDB 索引冲突分析及解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    MongoDB数据库索引介绍.pptx

    MongoDB数据库索引介绍.pptx

    MongoDB索引使用详解

    索引就像书的目录,如果查找某内容在没有目录的帮助下,只能全篇查找翻阅,这导致效率非常的低下;如果在借助目录情况下,就能很快的定位具体内容所在区域,效率会直线提高。 索引简介 首先打开命令行,输入mongo。...

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

    MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致。由于集合中的键(字段)可以是普通数据类型,也可以是子文档。MongoDB可以在各种类型的键上创建索引。下面分别讲解...

    MONGODB的索引探究

    MONGO的索引跟MYSQL、ORACLE基本上差不多,实现了其中的一部分,当然了,肯定是没有它们功能齐全的,因为MONGO本质上也是基于磁盘文件的,所以如果索引的话,效率是不敢想像的!

    关于MongoDB索引管理-索引的创建、查看、删除操作详解

    本文讲述了关于MongoDB索引管理包括索引的创建、查看索引、删除索引各方面的命令及使用方法

    课时11:MongoDB索引原理及使用.mp4

    MongoDB数据库

    iiizk#JavaNotes#4、MongoDB索引1

    1. 普通索引 1. 单列索引 2. 多列索引 3. 子文档索引 2. 唯一索引 3. 稀疏索引 4. 哈希索引 5. 重建索引 6. 删除索引 7. 查看索引

    MongoDB 索引 和explain分析查询速度1

    一、索引基础1 二、唯一索引2 三、索引的一些参数3 一、索引基础 二、唯一索引 三、索引的一些参数 四、使用 explain 五、explain execut

    index-model:MongoDB索引模型

    mongodb-index-model 适用于人类的MongoDB索引工具包。例子var IndexModel = require ( 'mongodb-index-model' ) ;// e.g. from collection.getIndexes()var indexDefs = [ { 'v' : 1 , 'key' : { '_id' : 1 } , '...

    MongoDB索引实战技巧

    主要描述了MongoDB索引相关的一些基础知识和使用技巧。 虽然MongoDB的索引在存储结构上都是一样的,但是根据不同的应用层需求,还是分成了唯一索引(unique)、稀疏索引(sparse)、多值索引(multikey)等几种类型...

    深入解析MongoDB聚合与索引:提升数据库效能的关键策略

    同时,深入探讨MongoDB索引的类型(如单键索引、复合索引、多键索引等),并分析索引的创建、管理和优化策略。此外,文章还介绍了索引对查询性能的影响,包括如何通过explain()方法分析查询和索引效率,以及覆盖查询...

Global site tag (gtag.js) - Google Analytics