7.MongoDB索引

7.1 索引介绍

        索引是一种用来快速查询数据的数据结构。B+Tree就是一种常用的数据库索引数据结构,MongoDB 采用B-Tree 做索引,索引创建在colletions上。MongoDB不使用索引的查询,先扫描所有的文档,再 匹配符合条件的文档。 使用索引的查询,通过索引找到文档,使用索引能够极大的提升查询效率。

MongoDB索引数据结构

        思考:MongoDB索引数据结构是B-Tree还是B+Tree?

B-Tree说法来源于官方文档,然后就导致了分歧:有人说MongoDB索引数据结构使用的是B-Tree,有的 人又说是B+Tree。

MongoDB官方文档:https://docs.mongodb.com/manual/indexes/

MongoDB indexes use a B-tree data structure.

WiredTiger官方文档:https://source.wiredtiger.com/3.0.0/tune_page_size_and_comp.html WiredTiger maintains a table's data in memory using a data structure called a B-Tree ( B+ Tree to be specific), referring to the nodes of a B-Tree as pages. Internal pages carry only keys. The leaf pages store both keys and values.

参考数据结构网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

索引的分类

1.按照索引包含的字段数量,可以分为单键索引和组合索引(或复合索引)。

2.按照索引字段的类型,可以分为主键索引和非主键索引。

3.按照索引节点与物理记录的对应方式来分,可以分为聚簇索引和非聚簇索引,其中聚簇索引是指索 引节点上直接包含了数据记录,而后者则仅仅包含一个指向数据记录的指针。

4.按照索引的特性不同,又可以分为唯一索引、稀疏索引、文本索引、地理空间索引等

        与大多数数据库一样,MongoDB支持各种丰富的索引类型,包括单键索引、复合索引,唯一索引等一 些常用的结构。由于采用了灵活可变的文档类型,因此它也同样支持对嵌套字段、数组进行索引。通过 建立合适的索引,我们可以极大地提升数据的检索速度。在一些特殊应用场景,MongoDB还支持地理 空间索引、文本检索索引、TTL索引等不同的特性。

7.2索引操作

创建索引

创建索引语法格式

db.collection.createIndex(keys, options)

1.Key 值为你要创建的索引字段,1 按升序创建索引, -1 按降序创建索引

2.options 可选参数列表如下:

参数 类型 描述
background Boolean 建索引过程会阻塞其它数据库操作,background可 指定以后台方式创建索引,即增加 "background" 可 选参数。 "background" 默认值为false。
unique Boolean 建立的索引是否唯一。指定为true创建唯一索引。默 认值为false
name String 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
dropDups Boolean 3.0+版本已经废弃,在建立唯一索引时是否删除重复记 录,指定 true 创建唯一索引。默认值为 false.
spare Boolean 对文档中不存在的字段数据不启用索引;这个参数需 要特别注意,如果设置为true的话,在索引字段中不 会查询出不包含对应字段的文档.。默认值为 false.
expireAfterSeconds Integer 指定一个以秒为单位的数值,完成 TTL设定,设定集 合的生存时间。
v index version 索引的版本号。默认的索引版本取决于mongod创建 索引时运行的版本。
weights document 索引权重值,数值在 1 到 99,999 之间,表示该索引 相对于其他索引字段的得分权重。
default_language String 对于文本索引,该参数决定了停用词及词干和词器的 规则的列表。 默认为英语
language_overside String 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.

注意:3.0.0 版本前创建索引方法为 db.collection.ensureIndex()

# 创建索引后台执行
db.books.createIndex({open:1,close:1},{background:true});
// 1
{
    "numIndexesBefore": NumberInt("1"),
    "numIndexesAfter": NumberInt("2"),
    "createdCollectionAutomatically": false,
    "ok": 1
}
# 创建唯一索引
db.books.createIndex({title:1},{unique:true})
// 1
{
    "numIndexesBefore": NumberInt("2"),
    "numIndexesAfter": NumberInt("3"),
    "createdCollectionAutomatically": false,
    "ok": 1
}

查看索引

#查看索引信息
db.books.getIndexes()
// 1
[
    {
        "v": NumberInt("2"),
        "key": {
            "_id": NumberInt("1")
        },
        "name": "_id_"
    },
    {
        "v": NumberInt("2"),
        "key": {
            "open": 1,
            "close": 1
        },
        "name": "open_1_close_1",
        "background": true
    },
    {
        "v": NumberInt("2"),
        "key": {
            "title": 1
        },
        "name": "title_1",
        "unique": true
    }
]
#查看索引键
db.books.getIndexKeys()

查看索引占用空间

db.collection.totalIndexSize([is_detail])

is_detail:可选参数,传入除0或false外的任意数据,都会显示该集合中每个索引的大小及总大 小。如果传入0或false则只显示该集合中所有索引的总大小。默认值为false。

db.books.totalIndexSize();
>61440

删除索引

#删除集合指定索引
db.col.dropIndex("索引名称")
#删除集合所有索引
db.col.dropIndexes()
db.books.dropIndex('open_1_close_1')
>{ nIndexesWas: 3, ok: 1 }

7.3索引类型

单键索引(Single Field Indexes)

在某一个特定的字段上建立索引 mongoDB在ID上建立了唯一的单键索引,所以经常会使用id来进行查 询; 在索引字段上进行精确匹配、排序以及范围查找都会使用此索引

db.books.createIndex({title:1})

对内嵌文档字段创建索引:

{
    "_id": ObjectId("68ca320762642f53ba95fb66"),
    "title": "book-0",
    "type": "travel",
    "tag": [
        "nosql",
        "document"
    ],
    "favCount": NumberInt("97"),
    "author": {
        "username": "xx009",
        "age": NumberInt("29")
    },
    "_class": "com.tuling.learnmogodb.entity.Book"
}
db.books.createIndex({"author.username":1})
{
    "numIndexesBefore": NumberInt("2"),
    "numIndexesAfter": NumberInt("3"),
    "createdCollectionAutomatically": false,
    "ok": 1
}

复合索引(Compound Index)

        复合索引是多个字段组合而成的索引,其性质和单字段索引类似。但不同的是,复合索引中字段的顺序、字段的升降序对查询性能有直接的影响,因此在设计复合索引时则需要考虑不同的查询场景。

db.books.createIndex({type:1,favCount:1})
// 1
{
    "numIndexesBefore": NumberInt("3"),
    "numIndexesAfter": NumberInt("4"),
    "createdCollectionAutomatically": false,
    "ok": 1
}

多键索引(Multikey Index)

在数组的属性上建立索引。针对这个数组的任意值的查询都会定位到这个文档,既多个索引入口或者键值 引用同一个文档

准备inventory集合:

db.inventory.insertMany([
{ _id: 5, type: "food", item: "aaa", ratings: [ 5, 8, 9 ] },
{ _id: 6, type: "food", item: "bbb", ratings: [ 5, 9 ] },
{ _id: 7, type: "food", item: "ccc", ratings: [ 9, 5, 8 ] },
{ _id: 8, type: "food", item: "ddd", ratings: [ 9, 5 ] },
{ _id: 9, type: "food", item: "eee", ratings: [ 5, 9, 5 ] }
])

创建多键索引

db.inventory.createIndex( { ratings: 1 } )
{
    "_id": 5,
    "type": "food",
    "item": "aaa",
    "ratings": [
        5,
        8,
        9
    ]
}

多键索引很容易与复合索引产生混淆,复合索引是多个字段的组合,而多键索引则仅仅是在一个字段上 出现了多键(multi key)。而实质上,多键索引也可以出现在复合字段上


                
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值