MongoDB 索引限制学习笔记

索引简介

MongoDB 是一种非关系型数据库,它使用了 B-tree 索引来加速查询操作。索引是一个包含有序键值的数据结构,在查询文档时可以快速定位需要的数据。

在 MongoDB 中,我们可以创建多个索引来支持不同的查询需求。但是,在使用索引时也需要注意一些限制和要求。

索引限制

1. 索引键长度限制

MongoDB 中的索引键(即 B-tree 节点中的键)最大长度为 1024 字节。如果超过这个长度就会导致创建索引失败。

2. 内存限制

MongoDB 中的索引是存储在内存中的,因此在创建索引时需要考虑内存的限制。如果创建的索引太多或者太大,就会导致内存不足。

3. 索引数量限制

MongoDB 的索引数量不能超过 64 个。如果创建的索引数量超过了这个限制,就需要删除一些无用的索引或者优化索引的设计。

4. 分片键限制

在分片集群中,MongoDB 中的分片键必须是单个字段或者复合字段。如果分片键不符合这个要求,就会导致分片失效。

5. 地理位置索引限制

MongoDB 中的地理位置索引(即 2dsphere 和 2d 索引)必须在一个集合中最多创建一个。如果创建多个地理位置索引,就会导致查询不可用。

实例演示

我们可以通过下面的实例来演示 MongoDB 索引限制的使用。

假设我们有一个名为 users 的集合,其中包含以下文档:

jsonCopy Code
{ "name": "Alice", "age": 25, "gender": "female", "location": { "type": "Point", "coordinates": [40, 70] } } { "name": "Bob", "age": 30, "gender": "male", "location": { "type": "Point", "coordinates": [45, 75] } }

创建索引

我们可以创建一个基于 name 字段的索引:

shellCopy Code
db.users.createIndex({name: 1})

这个操作会在 users 集合中创建一个名为 name_1 的索引,用于加速基于 name 字段的查询。

索引键长度限制

尝试创建一个基于 location.coordinates 字段的索引:

shellCopy Code
db.users.createIndex({"location.coordinates": 1})

这个操作会失败,因为 location.coordinates 的字符串长度超过了索引键的最大限制。

索引数量限制

尝试创建过多的索引:

shellCopy Code
for (var i = 1; i <= 100; i++) { db.users.createIndex({["field" + i]: 1}) }

这个操作会失败,因为我们创建了超过 64 个的索引。

地理位置索引限制

尝试创建多个地理位置索引:

shellCopy Code
db.users.createIndex({"location": "2dsphere"}) db.users.createIndex({"location.coordinates": 1})

这个操作会失败,因为我们在同一个集合中创建了多个地理位置索引。