mongo: 索引

索引创建

在学习索引之前,我们先看一下,如果没有添加索引时,我们用explain()函数,查看查询计划是什么样的。

发现使用的是BasicCursor,那么就代表我们没有索引,当我们查某一个数据的时候,就是从头到尾的扫一遍

  1. 索引提高查询速度,但是会降低写入和更改速度,权衡常用的查询字段,不必在太多列上建索引

a)      新增一条数据的同时,还会新增索引文件,所以会降低写入和更改速度,所以需要权衡字段,没必要添加太多的索引

  2.在mongodb中,索引可以按字段升序(1)/降序(-1)来创建,便于排序

-1:磁盘上,二叉树倒序排序,由大到小,我们人眼是看不出来的

  3.默认是用btree来组织所以文件,2.4版本以后,也允许建立hash索引

索引的分类:

常用命令:

  1. 查看当前索引状态:db.collection.getIndexes();
  2. 创建普通的单列索引:db.collection.ensureIndex(field:1/-1);//1代表升序,-1代表降序
  3. 创建多列索引:db.collection.ensureIndex(field:1/-1,field2:1/-1);

我们如何优化mysql的时候,有多人说,为where语句常用的字段添加索引,但是仔细想想,这么说实际上是错误的,因为我们的where语句,经常会好几个字段一起用,但是只能有一个索引起作用。所以应该建立多列索引。在mongo中也是这样的

多列索引和为每一个列都建立索引是不一样的,多列索引是把多个列看成一个整体,进行索引。如果两个列经常放在一起查,那么,使用多列索引要比在每一个列上加索引效率要高。

  4.创建子文档索引:db.collection.ensureIndex(field.subfield:1/-1);

我们插入的数据为:

db.shop.insert({name:’Nokia’,spc:{weight:120,area:’taiwan’}});

{weight:120,area:’taiwan’}是子文档,如何在子文档中添加索引?使用点’.’,如下图

  5.创建唯一索引:db.collection.ensureIndex({field.subfield:1/-1},{unique:true});

注意:唯一索引,这个列上的值不能重复,下图中,我们在添加了唯一索引的列email中,添加两条相同的值,会报error

  6.创建稀疏索引:

稀疏索引的特点----如果针对field做索引,针对不含field列的文档,将不建立索引,与之相对,普通索引,会把该文档的field列的值认为NULL,并建立索引

适宜于:小部分文档含有某列时

db.collection.ensureIndex({field:1/-1},{sparse:true});

创建非稀疏索引:结果如下:

删除索引之后,再添加稀疏索引,结果如下

  7.创建哈希索引(2.4新增的)

哈希索引速度比普通索引要快,但是无法对范围查询进行优化,适宜于—随机性强的散列

简要介绍一下哈希索引:哈希索引是通过把key给哈希函数,然后通过哈希函数计算出一个唯一值,从而决定了这个数据存放在磁盘的什么位置上。所以值的存储是散列的,没有可循的规律性,当我们要查找一个数据的时候,比如查找学号为99的学生,我们可以这样。但是我们要查找200-500这样一个范围内的所有学生,哈希索引显然就不合适了。因为它的存储不是连续的,在这种情况普通索引就要好很多。

db.collection.ensureIndex({field:’hashed’});

  8.删除单个索引

db.collection.dropIndex({field:1/-1});//字段,和排序方式(1/-1)都需要指明

删除所有索引

db.collection.dropIndexes();

  9.重建索引

_id索引是自带的,必须会有的

email_1  升序排列

时间: 2024-10-14 20:52:44

mongo: 索引的相关文章

使用Mongo索引需要注意的几个点

1.正则表达式和取反运算符不适合建立索引 正则表达式:$regex 取反运算符:$ne ,$nin 2.backgroud建立索引速度缓慢 前台创建是会有阻塞,backgroud效率缓慢,实际情况实际分析 3.mongo支持存储数组,并可将数组设为索引 对于$in操作符,索引是有效的.

mongo索引

索引自动创建和手工创建 db.stu.drop(); db.stu.insert({"name":"张三","sex":"男","age":18,"score":70,"address":"河南"}); db.stu.insert({"name":"李四","sex":"女&qu

Mongo的一些心得

一.mongo-java-driver 项目中使用的是java原生mongo操作api,个人觉得,不是那么的方便,资料好像也比较少,只有官方文档可供使用 基础用法不再啰嗦,特别介绍下mongo的批量查询和批量插入. 之前看过一遍博客,http://blog.sina.com.cn/s/blog_56545fd301013zav.html 介绍说批量插入和普通插入一样,正巧工作需要,有大约3000w左右数据(1000w遗留数据需要剔除)需要迁移,那么我就进行了数据源库的批量查询和新库的普通插入 (

MongoDB数据模型和索引学习总结

MongoDB数据模型和索引学习总结 1. MongoDB数据模型: MongoDB数据存储结构: MongoDB针对文档(大文件採用GridFS协议)採用BSON(binary json,採用二进制编码)数据格式来存储和交换数据.Bson吸收了JSON schema-less的特点,存储结构松散,不须要像RDB(关系数据)那样事先定义数据存储的元数据结构.另外添加了多种数据类型的支持和优化,使读写更加高效. (1) BSON 支持的数据类型: Double.String.Object.Arra

mongo管理

mongo管理 安装 源安装(ubuntu) echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10 a

mongodb 内存分析

要想了解mongo的内存机制就要先了解linux系统的内存分析. 第一步:先看看linux的内存参数都是怎么说的              total       used       free     shared    buffers     cached Mem:         11912       9045       2866          0         90       3406 -/+ buffers/cache:       5549       6363  Swa

MongoDB查询优化

项目场景:Mongo在首次查询特慢,后面就好的.如果长时间不查询,下次开始的第一次又将非常慢,于是从链接当时多方面,排查最终发现还是mongo索引建的有问题. MongoDB在大批量数据查询时经常会遇到查询耗时长,通常情况采用建各种索引来优化. 首先第一步排查,可以在查询后使用.explain()来查看查询数据轨迹,便于分析每个分片的查询索引. db.Collection.find({}).explain() 查看索引,如果不位可以根据查询条件,新建索引. 1.查询索引 db.COLLECTIO

mongo分片丢失分片索引

mongo分片备份后删除分片并重建分片索引,结果常遇到以下情况: shard01上的集合创建了分片索引,而shard02上却没有创建分片索引,导致chunk只分布在shard01分片上. 具体报错信息: "errmsg" : "aborting migration, shard is missing 1 indexes and collection is not empty. Non-trivial index creation should be scheduled man

Mongo 后台加索引踩坑

背景,随着mongo数据量变大,查询效率变低,要对索引进行优化,所在公司对mongo依赖比较严重,而DBA并不对mongo的权限做控制,所以每个后端开发都有mongo的读写权限,通常每个人各自管理自己的模块的数据. 由于笔者所负责的模块数据增长较快,用户的关键业务数据都存在mongo里面,很快mongo里面的数据就积累到几百万,之前只有一个五个字段的联合索引,所以是时候作死了... 本着作死要有条不紊有依有据的原则,在测试数据库接近百万数据量的相同Collection里面进行了实操,阻塞方式加索