MongoDB——索引类型、索引管理

唯一索引

唯一索引可以确保集合的每一个文档的指定键都有唯一值。例如,如果想保证文档的username键拥有不同的值,那么可以创建一个唯一索引:

在这里插入图片描述
试图重复插入:
在这里插入图片描述
发现有重复的键时抛出异常会影响效率,所以可以使用唯一索引来应对偶尔可能会出现的键重复问题,而不是在运行时对重复的键进行过滤。

注意:如果一个文档没有对应的键,索引会将其作为null存储。所以,如果对某个键建立了唯一索引,但插入了多个缺少该索引键的文档,由于集合已经存在一个该索引键的值为null的文档而导致插入失败。

有些情况下,一个值可能无法被索引。索引储桶(indexbucket)的大小是有限制的,如果某个索引条目超出了它的限制,那么这个条目就不会包含在索引里。这样会造成一些困惑,因为使用这个索引进行查询时会有一个文档凭空消失不见了。所有的字段都必须小于1024字节,才能包含到索引里。如果一个文档的字段由于太大不能包含在索引里,MongoDB不会返回任何错误或者警告。也就是说,超出8 KB大小的键不会受到唯一索引的约束:可以插入多个同样的8KB长的字符串。

符合唯一索引:
也可以创建符合索引的唯一索引。创建符合唯一索引时,单个键的值可以相同,但所有键的组合值必须是唯一的。

在这里插入图片描述

去除重复:
在已有集合上创建唯一索引时可能会失败,因为集合中可能已经存在重复值了。

通常需要先对已有数据进行处理(可以使用聚合框架),找出重复的数据,想办法处理。

在极少数情况下,可能希望直接删除重复的值。创建索引时使用dtrpDups选项,如果遇到重复的值,第一个会被保留,之后的重复文档都会被删除。

在这里插入图片描述

dropDups会强制性建立唯一索引,但是无法控制哪些文档被保留哪些文档被删除(MongoDB不会给出提示)。

稀疏索引

唯一索引会把null看做值,所以无法将多个缺少唯一索引中的键的文档插入到集合中。然而,在有些情况下,可能希望唯一索引只对包含相应键的文档生效。如果有一个可能存在也可能不存在的字段,但是当它存在时,它必须是唯一的,这时就可以将uniquesparse选项组合在一起使用。

在这里插入图片描述
注意:MongoDB中的稀疏索引(sparseindex)与关系型数据库中的稀疏索引是完全不同的概念。基本上来说,MongoDB中的稀疏索引只是不需要将每个文档都作为索引条目。

根据是否使用稀疏索引,同一个查询的返回结果可能会不同。

假如有一个这样的集合,起重的大部分文档都有一个x字段,但是有些没有。当在x上执行查询时,它会返回相匹配的文档:
在这里插入图片描述
在这里插入图片描述

如果在x上创建一个稀疏索引,_id为0的文档就不会包含在索引中。如果再次在x上查询,MongoDB就会使用这个稀疏索引,{_id:0}的这个文档就不会被返回。

如果需要得到那些不包含x字段的文档,可以使用hint()强制进行全表扫描。

索引管理

所有的数据库索引信息都存储在system. indexes集合中。这是一个保留集合,不能在其中插人或者删除文档。只能通过ensureIndex或者dropIndexes对其进行操作。

创建一个索引之后,就可以在system. indexes中看到它的元信息。可以执行db. collectionName . getIndexes()来查看给定集合上的所有索引信息:
在这里插入图片描述
这里面最重要的字段是"key"和"name"。这里的键可以用在hint、max. min以及其他所有需要指定索引的地方。在这里,索引的顺序很重要: {“x” : 1,“y” :1}.上的索引与{“y” : 1, “x” : 1} .上的索引不同。对于很多的索引操作(比如dropIndex),这里的索引名称都可以被当作标识符使用。但是这里不会指明索引是否是多键索引。

标识索引

集合中的每一个索引都有一个名称,用于唯一标识这个索引,也可以用于服务器端来删除或者操作索引。索引名称的默认形式是keyname1_dirl_keyname2_dir2_keynameN_dirN,其中keynameX是索引的键,dirX 是索引的方向(1 或者-1)。如果索引中包含两个以上的键,这种命名方式就显得比较笨重了,好在可以在createIndex中指定索引的名称:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/cold___play/article/details/121584067