第九章 索引(概览)

第九章 索引(概览)

  • 默认索引
  • 创建索引
  • 索引类型
  • 索引属性
  • 覆盖索引

索引可以帮助我们提高查询速度。没有索引的话,MongoDB会执行全表扫描,找到查询条件匹配的记录。如果查询中使用到了索引,MongoDB可以过滤掉一部分记录,从而提高查询速度。

索引是一种特殊的数据结构(B-Tree),它存储 collection 的一小部分信息,使得遍历更快。索引存储了字段的值,而且根据字段的值排序。索引的顺序对等值匹配范围匹配非常有效。另外,在索引中使用排序,将返回排序后的结果。

假设有一个集合,存储以下记录。

{
    "_id": ObjectId("5fa7559d9ef0f4b2945e4e1f"),
    "firstName": "tom1",
    "score": NumberInt("27")
},
{
    "_id": ObjectId("5fa7559d9ef0f4b2945e4e20"),
    "firstName": "tom2",
    "score": NumberInt("24")
},
{
    "_id": ObjectId("5fa7559d9ef0f4b2945e4e21"),
    "firstName": "tom3",
    "score": NumberInt("25")
},
{
    "_id": ObjectId("5fa7559d9ef0f4b2945e4e22"),
    "firstName": "tom4",
    "score": NumberInt("26")
}

如果score没有索引,我们想对结果排序,那么我们的查询语句如下。

db.person.find({"score": {$lt: 28}}).sort({"score": 1})

如果我们对score创建一个升序索引,那么返回的结果本身就有序,不需要在排序,查询语句如下。

// 创建索引
db.person.createIndex({"score": 1})

// 查询
db.person.find({"score": {$lt: 28}})
默认_id索引

MongoDB会在字段 _id 字段上创建 唯一索引。这个 _id 可以防止两个带有相同 _id 值的文档插入。你不能删除这个默认索引。

创建索引
db.collection_name.createIndex(<key and inde type specification>, option)

name 字段创建降序索引

db.collection_name.createIndex({name : -1})

MongoDB 的索引使用B-Tree

索引名

索引默认名是索引key+索引顺序。例如创建索引 {item : 1, quantity : -1} 的默认索引名为:item_1_quantity_-1

为了具有可读性,我们可以自定义索引名。例如

db.products.createIndex(
	{item: 1, quantity: -1},
	{name: "query for inventoty"}
)

你可以使用 db.collection_name.getIndexes() 查看索引名。你不能对索引进行重命名

索引类型

Single Field:单个索引的顺序无关紧要,MongoDB可以从任意方向(升序或降序)遍历。

Compound Field:联合索引。联合索引的索引索引顺序就非常有必要。例如,联合索引 {userId: 1, score: -1} ,索引会优先按照第一个值,也就是userId的值进行排序,在userId相等情况下,再按照score排序。
在这里插入图片描述

对于联合索引来说,索引key的排序顺序决定了这个索引是否支持排序。

Multikey Index:MongoDB的 Multikey Index 索引是建立在数组字段上。如果你的索引是建立在数组上的,MongoDB会为数组中每个元素创建索引项。如果索引字段包含数组,MongoDB会自动决定是否需要创建 Multikey Index ;不需要显示指定。

Hashed Indexes:哈希索引。为了支持基于哈希进行分片,MongoDB提供了哈希索引类型,哈希索引存储字段值的哈希值(我是这么理解的)。分布随机,但是哈希索引仅支持 等值查询 不支持 范围查询

索引属性

Unique Indexes
唯一性可以确保防止插入相同的记录到数据库。

Sparse Indexes (稀疏索引)
稀疏索引可以确保索引只包含具有索引字段的文档条目。稀疏索引会跳过那些不包含索引字段文档条目。
你可以组合 sparese indexunique index 来防止插入重复的文档。

TTL Indexes
TTL Indexes 可以用来指定索引在一段时间后删除文档。

Hidden Indexes
Hidden indexes 对查询计划(query planner)不可以见并且在查询中也不能使用。我们可以使用该属性来评估将要删除的索引是否会造成一些影响。

覆盖索引

query Criteriaprojection of query 仅包含这个索引字段,MongoDB直接从索引返回结果,不会扫描任何文档或者加载入内存。覆盖索引是优化查询非常有效的方式。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值