`
风雪涟漪
  • 浏览: 496911 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
博客专栏
952ab666-b589-3ca9-8be6-3772bb8d36d4
搜索引擎基础(Search...
浏览量:8766
Ae468720-c1b2-3218-bad0-65e2f3d5477e
SEO策略
浏览量:17668
社区版块
存档分类
最新评论

MongoDB 索引

阅读更多

索引Indexes

索引常常用来大幅度的提升查询的性能。 考虑应用程序的查询种类是非常重要的事情,因此你就要定义相关的索引。
决定了之后,在MongoDB中创建索引是非常简单的。

基础


索引就是collection中一个document指定一个字段值的数据结构。MongoDB查询优化器可以使用这个数据结构快速分类整理以及排序document。一般来说,索引的实现是B-TREE。

在Shell中,你可以使用ensureIndex()来创建索引,并且指定要索引一个或多个字段。

我们在j字段上创建一个索引
db.things.ensureIndex({j:1});
如果索引不存在,ensureIndex就创建索引。
一旦索引被创建了,匹配索引字段的查询是非常快速的。
没有索引的话,MongoDB必须检查每个document要查询的字段。
db.things.find({j : 2}); // 快速,使用了索引。
db.things.find({x : 3});  // 慢- 检查所有的document,因为x没有被索引。
你可以使用db.things.getIndexes();来查看索引信息。

默认索引
_id字段默认被添加了索引。这个索引也不能被删除。_id索引是唯一的。Capped Collections并不会默认创建索引。


Embedded Keys
你甚至可以向embedded document的字段创建索引。例子
db.things.ensureIndex({"address.city": 1})
document做为key

索引的字段可以为任意类型,包括了document类型。

db.factories.insert( { name: "xyz", metro: { city: "New York", state: "NY" } } );
db.factories.ensureIndex( { metro : 1 } );
//这个查询可以使用上面创建的索引。
db.factories.find( { metro: { city: "New York", state: "NY" } } );
//等同于
db.factories.find( { metro: { $gte : { city: "New York" } } } );
//metro内的字段顺序错误,不能应用这个索引。
db.factories.find( { metro: { state: "NY" , city: "New York" } } );

也可以创建这个document内字段的组合索引。

db.factories.ensureIndex( { "metro.city" : 1, "metro.state" : 1 } );
//以下查询可以使用上面创建的索引。
db.factories.find( { "metro.city" : "New York", "metro.state" : "NY" } );
db.factories.find( { "metro.city" : "New York" } );
db.factories.find().sort( { "metro.city" : 1, "metro.state" : 1 } );
db.factories.find().sort( { "metro.city" : 1 } )
下面谈谈这两种方法的优劣势。
当使用整个document做为索引,顺序就默认定义了,升序。
当使用组合索引,你可以混合升序和降序的key,并且查询优化器使用该索引也需要匹配查询中的首个字段。

数组

当索引的键为数组的时候,MongoDB会索引数组中每个元素。


组合索引

除了支持单个字段的索引,MongoDB也支持索引多个字段。创建的索引地方法一样,都使用ensureIndex()。但是你可以指定多个字段。

db.things.ensureIndex({j:1, name:-1});
当创建索引的时候,上面的数字1和-1代表着索引的方向。1是升序,-1为降序。如果为单个索引,顺序并无所谓。如果使用组合索引,顺序就非常重要了。

你可以在多个字段创建索引,查询可以用字段子集做为开头来匹配索引。

如果你在a,b,c上创建索引。

下列查询都可以使用这个索引。
a
a,b
a,b,c
1.6+新特性
目前,可以组合索引中的字段条件可以为等值的组合或者范围查询。
如果索引中的首个字段存在于查询中,那么查询优化器可能会选用这个索引。
如果索引中的首个字段不存在于查询中,如果显式使用hint才可以使用这个索引。
索引的子集字段在查询中,这种索引可以用在很多地方。
做为一般的规则来说,对于指定的查询,最又索引就是那些要查询的字段。

Sparse Indexes稀疏索引

  目前的限制
稀疏索引只能在一个字段上创建. SERVER-2193

1.7.4的新功能。

sparse index就是在一个存在于document的字段上创建的索引。
任何document中不存在这个索引的字段,那么就不会保存在索引中。之所以叫sparse,当没有索引字段的值的时候,document也就丢失了。

Sparse indexes, 不是完整的索引,也和完整索引操作上有所不同。当使用一个sparse index排序,一些document就不会返回了。
只有存在于index中的document才会返回。

db.people.ensureIndex({title : 1}, {sparse : true})
db.people.save({name:"Jim"})
db.people.save({name:"Sarah", title:"Princess"})
db.people.find({title:{$ne:null}}).sort({title:1}) 
// 只返回 Sarah的文档

你可以把sparse何unique索引结合起来,来给那些没有丢失字段的document加以唯一性约束。

 

Unique Indexes唯一索引

MongoDB支持唯一索引,保证了插入document的索引值和已存在document索引值不重复。

下面的示例就保证了不会有两个document中的firstname和lastname值相等。

db.things.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
丢失的键
当保存一个不存在唯一索引的字段的document,那么这个字段的值默认为null。但是这种缺失索引字段的document只能插入一次了。
db.things.ensureIndex({firstname: 1}, {unique: true});  
db.things.save({lastname: "Smith"}); 
 /这个操作就会发生错误。 
db.things.save({lastname: "Jones"});
重复的值
一个唯一索引的值是不能重复的。

保存首个document,而要删除其他索引值和它重复的document,添加参数dropDups
db.things.ensureIndex({firstname : 1}, {unique : true, dropDups : true})


在后台创建索引


创建一个索引,默认的情况会阻塞其他数据库的操作。在1.3.2+版本,支持后台创建索引background index build option .

删除索引

删除指定collection的索引语句为

db.collection.dropIndexes();

删除一个单独的索引

db.collection.dropIndex({x: 1, y: -1})

直接运行一个命令

// 注意:1.3.2之前 命令是"deleteIndexes", 而不是 "dropIndexes"
// 从foo collection中删除 {y:1}索引
db.runCommand({dropIndexes:'foo', index : {y:1}})
// 删除所有索引
db.runCommand({dropIndexes:'foo', index : '*'})

重新索引

reIndex会重新创建索引

db.myCollection.reIndex()
// 等同于:
db.runCommand( { reIndex : 'myCollection' } )

一般来说用不上。如果collection大小增长太快或者索引占用空间看起来很大,就可以使用reIndex。

修复数据库会重新创建索引。

额外要注意的

  • MongoDB 索引区分大小写。
  • 当你更新u update 一个对象, 如果对象占用了之前分配的区域, 仅仅是那些更新值的索引需要更新,这样做提升了性能。注意如果对象增大并且需要迁移,那么所有的索引也需要更新,过程比较慢。
  • 索引信息在system.indexes的collection中。Index 运行 db.system.indexes.find() 查看索引。
索引的性能

索引主要用于查询,也包括了排序,非常的快。通过索引查找的document更新也是非常快的。
然而,要记住的是,索引会降低插入和删除的性能。原因就是数据的写入也要同时也如索引。
但是索引对于那些读取多于写入的collection尤为有用。
对于写入数据频率高的collection,索引会影响性能。
大部分collection都是读取率高,所以索引对于大部分场景还是非常不错的。

不适用索引来进行排序
如果排序的数据非常少(小于4M),那就不需要索引。一般要limit和sort一起使用。

Geospatial地理空间

分享到:
评论

相关推荐

    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