`
bit1129
  • 浏览: 1069853 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【MongoDB学习笔记九】MongoDB索引

 
阅读更多

索引

  • 可以在任意列上建立索引
  • 索引的构造和使用与传统关系型数据库几乎一样,适用于Oracle的索引优化技巧也适用于
    Mongodb
  • 使用索引可以加快查询,但同时会降低修改,插入等的性能
  • 内嵌文档照样可以建立使用索引

测试数据

 

 

var p1 = {
"name":"Jack",
"age":34,
"nickname":"xiaoqiang",
friends:[
  {"name":"Cloe","age":"28"},	
  {"name":"Audrey","age":"31"},
]
}


var p2 = {
"name":"Cloe",
"age":28,
friends:[
  {"name":"Jack","age":"34"},	
  {"name":"Mike","age":"31"},
]
}

var p3 = {
"name":"Audrey",
"age":31,
friends:[
  {"name":"Jack","age":"34"},	
  {"name":"Hammer","age":"61","relation":"parent"},
]
}

var p = [p1,p2, p3];
db.people.drop();
db.people.insert(p);

 

 

 

建立索引

当查询列中包含name属性时,索引将其作用

db.people.ensureIndex({"name" : 1}) //1表示正向索引

 

建立复合索引

 

复合索引的起作用是当name和age属性相邻,复合索引起作用

db.people.ensureIndex({"name" : 1,"age" : -1}) //1表示正向索引,-1表示反向索引

 

查询计划查看索引是否作用

查询时,哪个索引起作用与find中定义的查询对象(JSON)的书写顺序无关,这是合理的,因为JSON对象本身是键值对,无序的键值集合

 

1. db.people.find().explain()

 

 

> db.people.find().explain();
{
	"cursor" : "BasicCursor", //因为查询属性不包含定义索引的属性,因此索引没有起作用
	"isMultiKey" : false,
	"n" : 3,
	"nscannedObjects" : 3,
	"nscanned" : 3,
	"nscannedObjectsAllPlans" : 3,
	"nscannedAllPlans" : 3,
	"scanAndOrder" : false,
	"indexOnly" : false,
	"nYields" : 0,
	"nChunkSkips" : 0,
	"millis" : 11,
	"indexBounds" : {
		
	},
	"server" : "tom-Inspiron-3521:27017"
}

 

 

2. db.people.find({"name":"Jack"});

 

> db.people.find({"name":"Jack"}).explain();
{
	"cursor" : "BtreeCursor name_1", //使用B数游标 name_1就是创建于name属性上的索引
	"isMultiKey" : false,
	"n" : 1,
	"nscannedObjects" : 1,
	"nscanned" : 1,
	"nscannedObjectsAllPlans" : 1,
	"nscannedAllPlans" : 1,
	"scanAndOrder" : false,
	"indexOnly" : false,
	"nYields" : 0,
	"nChunkSkips" : 0,
	"millis" : 10,
	"indexBounds" : {
		"name" : [
			[
				"Jack",
				"Jack"
			]
		]
	},
	"server" : "tom-Inspiron-3521:27017"
}

 

 

 3. db.people.find({"name":"Jack","age":34});

 

> db.people.find({"name":"Jack","age":34}).explain();
{
	"cursor" : "BtreeCursor name_1_age_-1", //使用了B树索引,定义于name和age上的索引
	"isMultiKey" : false,
	"n" : 1,
	"nscannedObjects" : 1,
	"nscanned" : 1,
	"nscannedObjectsAllPlans" : 1,
	"nscannedAllPlans" : 1,
	"scanAndOrder" : false,
	"indexOnly" : false,
	"nYields" : 0,
	"nChunkSkips" : 0,
	"millis" : 0,
	"indexBounds" : {
		"name" : [
			[
				"Jack",
				"Jack"
			]
		],
		"age" : [
			[
				34,
				34
			]
		]
	},
	"server" : "tom-Inspiron-3521:27017"
}

 

 

  4. db.people.find({"age":34, "name":"Jack"});

 

}
> db.people.find({"age":34, "name":"Jack"}).explain();
{
	"cursor" : "BtreeCursor name_1_age_-1",//age和name的次序颠倒不影响索引的使用
	"isMultiKey" : false,
	"n" : 1,
	"nscannedObjects" : 1,
	"nscanned" : 1,
	"nscannedObjectsAllPlans" : 1,
	"nscannedAllPlans" : 1,
	"scanAndOrder" : false,
	"indexOnly" : false,
	"nYields" : 0,
	"nChunkSkips" : 0,
	"millis" : 0,
	"indexBounds" : {
		"name" : [
			[
				"Jack",
				"Jack"
			]
		],
		"age" : [
			[
				34,
				34
			]
		]
	},
	"server" : "tom-Inspiron-3521:27017"
}

 

 

 5. db.people.find({"age":34, "nickname":"xiaoqiang", "name":"Jack"});

 

 

db.people.find({"age":34, "nickname":"xiaoqiang", "name":"Jack"}).explain();
{
	"cursor" : "BtreeCursor name_1", //因为name索引列定义了,因此使用name索引
	"isMultiKey" : false,
	"n" : 1,
	"nscannedObjects" : 1,
	"nscanned" : 1,
	"nscannedObjectsAllPlans" : 3,
	"nscannedAllPlans" : 3,
	"scanAndOrder" : false,
	"indexOnly" : false,
	"nYields" : 0,
	"nChunkSkips" : 0,
	"millis" : 17,
	"indexBounds" : {
		"name" : [
			[
				"Jack",
				"Jack"
			]
		]
	},
	"server" : "tom-Inspiron-3521:27017"
}

 

 

 6. db.people.find({ "name":"Jack","age":34, "nickname":"xiaoqiang"});

 

 

 db.people.find({ "name":"Jack","age":34, "nickname":"xiaoqiang"}).explain(); //name,age,nickname数序
{
	"cursor" : "BtreeCursor name_1", //name属性定义的索引起作用
	"isMultiKey" : false,
	"n" : 1,
	"nscannedObjects" : 1,
	"nscanned" : 1,
	"nscannedObjectsAllPlans" : 3,
	"nscannedAllPlans" : 3,
	"scanAndOrder" : false,
	"indexOnly" : false,
	"nYields" : 0,
	"nChunkSkips" : 0,
	"millis" : 0,
	"indexBounds" : {
		"name" : [
			[
				"Jack",
				"Jack"
			]
		]
	},
	"server" : "tom-Inspiron-3521:27017"
}

 

查询计划结果说明

  • cursor 用于指明这个查询,是否使用了索引,哪个属性使用索引
  • nsScanned 用于指明本次查询,数据库扫描的文档数一共多少。最佳情况是这个数字应该尽可能的接近查询结果返回的文档数
  • n 查询结果返回的文档数
  • millis 执行查询耗费的毫秒数

索引名

上面的例子中,索引的名字都是MongoDB自动创建的,如何创建索引名呢?

 

唯一索引

 

为内嵌文档的属性设置索引

 

查看索引

索引建好后,如何察看当前的数据库有哪些索引呢?可见,默认情况下,每个集合的_id属性都已经是正向索引,这是MongoDB内置提供的

 

> db.system.indexes.find();
{ "v" : 1, "name" : "_id_", "key" : { "_id" : 1 }, "ns" : "foobar.persons" }
{ "v" : 1, "name" : "_id_", "key" : { "_id" : 1 }, "ns" : "foobar.db-text" }
{ "v" : 1, "name" : "_id_", "key" : { "_id" : 1 }, "ns" : "foobar.addresses" }
{ "v" : 1, "name" : "_id_", "key" : { "_id" : 1 }, "ns" : "foobar.c" }
{ "v" : 1, "name" : "_id_", "key" : { "_id" : 1 }, "ns" : "foobar.people" }
{ "v" : 1, "name" : "name_1", "key" : { "name" : 1 }, "ns" : "foobar.people" }
{ "v" : 1, "name" : "name_1_age_-1", "key" : { "name" : 1, "age" : -1 }, "ns" : "foobar.people" }

 

 删除索引

 

> db.runCommand({"dropIndexes":"db.people","index":"name_1"}); //db.people不工作
{ "ok" : 0, "errmsg" : "ns not found" }
> db.runCommand({"dropIndexes":"foobar.people","index":"name_1"}); //foobar.people不工作
{ "ok" : 0, "errmsg" : "ns not found" }
> db.runCommand({"dropIndexes":"people","index":"name_1"}); //使用people,即指定了集合的名称即可
{ "nIndexesWas" : 3, "ok" : 1 }

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    mongodb学习笔记资料

    mongodb学习笔记资料,从安装到操作库collection 对document的crud 索引 replicaSet sharding 备份与恢复

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

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

    MongoDB学习笔记

    自己在学习MongoDB的一些笔记,里面有各个查询选择器的使用截图,还有一些索引的介绍。

    MongoDB学习笔记思维导图.pdf

    MongoDB是目前流行的NoSQL数据库之一,它以高性能、高可用性和易于扩展的特性受到开发者的青睐。...通过本篇学习笔记,读者应当能够掌握MongoDB的基本操作、高级查询、索引管理以及安全性控制等核心知识点。

    Mongodb学习笔记.docx

    MongoDB 学习笔记 本文档是 MongoDB 学习笔记,涵盖了 NoSQL、Cache、运行平台等多个方面的知识点。 一、NoSQL 数据库 MongoDB MongoDB 是一个强大、灵活、可扩展性好的文档数据存储器,可以完成大部分关系数据库...

    mongodb学习笔记和mongodb权威指南

    首先,`mongodb_and_python`学习笔记可能涵盖了如何使用Python编程语言与MongoDB进行交互。Python是常见的MongoDB驱动程序之一,通过PyMongo库,开发者可以方便地执行CRUD(创建、读取、更新、删除)操作,构建复杂...

    MongoDB_学习笔记

    ### MongoDB 学习笔记知识点详解 #### 一、MongoDB 命令行基础操作 **1.1 帮助命令** - **help**:显示 MongoDB shell 的基本帮助信息。 - **db.help()**:提供当前数据库的帮助信息。 - **db.mycoll.help()**:...

    MongoDB学习总结笔记

    以下是对MongoDB学习的一些关键知识点的详细解释: 1. **MongoDB的基本概念**:MongoDB以集合(Collections)的形式存储数据,集合相当于关系型数据库中的表。集合内包含文档(Documents),文档是JSON格式的数据...

    mongodb学习笔记

    ### MongoDB 学习笔记知识点详解 #### MongoDB 介绍 ##### 简介 MongoDB 是一种基于分布式文件存储的数据库,使用 C++ 编写。它主要为 Web 应用程序提供可扩展、高性能的数据存储解决方案。MongoDB 的数据结构非常...

    MongoDB数据库学习笔记

    在学习MongoDB时,有几个关键的概念需要理解: 1. **数据库概念**:数据库是存储和管理数据的系统,根据需求提供数据查询。MongoDB是一种NoSQL数据库,不遵循传统的关系型数据库模式,因此没有固定的表结构。 2. *...

    MongoDB入门教程

    最后,MongoDB学习笔记(六)专注于MongoDB的索引和效率分析。索引是提升查询性能的关键,这部分会详细介绍如何创建、管理和使用索引,以及如何根据工作负载优化索引策略,以达到最佳查询效率。 总的来说,这个...

    MongoDB学习笔记—Linux下搭建MongoDB环境

    MongoDB是一种开源数据库系统,由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。...在学习过程中,不断实践和理解MongoDB的特性和操作方法,将有助于你更好地利用这个强大的数据库系统。

    MongoDB学习笔记(五) MongoDB文件存取操作

    - 考虑文件的访问模式,优化索引以提高查询性能。 - 监控存储和内存使用,以避免资源耗尽。 - 使用适当的权限和认证机制保护数据安全。 总之,MongoDB提供了灵活的文件存取方式,能够适应各种应用场景。无论是简单...

    mongoDB自学笔记

    学习MongoDB,不仅需要掌握其基本的数据操作、索引管理和查询优化,还需要理解其底层的数据存储模型和执行机制。以上的知识点涵盖了很多基础且重要的操作和概念,为使用MongoDB提供了坚实的基础。通过实际操作和反复...

    Studio 3T(MongoDB数据库GUI连接工具) 学习笔记

    这篇学习笔记将深入探讨如何使用Studio 3T与MongoDB进行交互。 首先,安装并启动Studio 3T。下载适合你操作系统的版本(Windows、macOS或Linux),按照安装向导完成安装。启动后,你会看到一个简洁的界面,准备连接...

    mongodb一些笔记

    MongoDB是一种流行的开源文档数据库系统,属于...这些笔记和教程涵盖了MongoDB的基础知识到高级用法,对于学习和理解MongoDB的操作和特性非常有帮助。通过阅读提供的文档,可以深入学习MongoDB的使用技巧和最佳实践。

Global site tag (gtag.js) - Google Analytics