MongoDB稀疏索引

MongoDB稀疏索引

稀疏索引(或者称间隙索引)就是只包含有索引字段的文档的条目,即使索引字段包含一个空值。也就是说间隙索引可以跳过那些索引键不存在的文档。因为他并非包含所有的文档,因此称为稀疏索引。

与之相对的非稀疏索引或者说普通索引则包含所有的文档以及为那些不包含索引的字段存储 null 值。

稀疏索引使用场景

账号体系设计过程中, 我们需要保证邮箱或手机号唯一。如果使用 mongodb 作为数据库。作为很强大 mongodb 肯定提供相应功能实现这种需求,而不是手动管理(手动查询是否存在)。

保证唯一性的解决方案就是唯一索引(unique index)。比如创建一个唯一索引:

db.users.createIndex( { "email": 1 }, { unique: true } )

这样重复的 email 将无法被 add 到数据库中。但这里也带来了一个问题,如果要同时支持手机号和邮箱,用户可能使用手机号注册,则邮箱为 null。而唯一索引对于会认为 null 也是重复的数据。导致手机号加入到数据库中失败。

稀疏索引仅包含具有索引字段的文档的条目,即使索引字段包含空值也是如此。索引会跳过缺少索引字段的任何文档。配合唯一索引使用,即可实现对存在的字段才使用唯一索引。

我们要确保某个字段存在才确保唯一性,即可以使用稀疏和唯一索引的复合索引来达到这个效果。

db.users.createIndex( { "email": 1 } , { sparse: true, unique: true } )

MongoDB稀疏索引详解

语法

db_name.table_name.createIndex( { "field": 1 }, { sparse: true } )

参数

名称 描述
db_name 数据库名
table_name 集合名

说明

通过指定 sparse 为 true,来创建稀疏索引。

案例

我们首先,使用 mongo 命令,连接上数据库,具体命令如下:

mongo

如下图所示:

24_MongoDB稀疏索引.png

现在,我们使用 use 命令,切换到 haicoder 数据库,具体命令如下:

use haicoder

现在,我们使用 insert 插入四条记录,具体命令如下:

db.haicoder.insert([ {id:1, "url" : "haicoder.net/c", "score" : 100 }, {id:2, "url" : "haicoder.net/cpp", "score" : 90 }, {id:3, "url" : "haicoder.net/golang", "score" : 80 }, {id:4, "score" : 60 } ]);

执行完毕后,此时,如下图所示:

25_MongoDB稀疏索引.png

我们看到,此时提示我们成功插入了多条记录,现在,我们创建一个稀疏索引,具体命令如下:

db.haicoder.ensureIndex({url:1}, {unique:true, sparse: true});

执行完毕后,此时,如下图所示:

26_MongoDB稀疏索引.png

现在,我们查看当前的所有索引,具体命令如下:

db.haicoder.getIndexes()

执行完毕后,此时,如下图所示:

27_MongoDB稀疏索引.png

我们看到,此时创建的 url 索引是稀疏索引。

MongoDB稀疏索引总结

稀疏索引(或者称间隙索引)就是只包含有索引字段的文档的条目,即使索引字段包含一个空值。也就是说间隙索引可以跳过那些索引键不存在的文档。因为他并非包含所有的文档,因此称为稀疏索引。

与之相对的非稀疏索引或者说普通索引则包含所有的文档以及为那些不包含索引的字段存储 null 值。