唯一索引可以确保集合的每一个文档的指定键都有唯一值。例如,如果想保证文档的username键拥有不同的值,那么可以创建一个唯一索引:
试图重复插入:
发现有重复的键时抛出异常会影响效率,所以可以使用唯一索引来应对偶尔可能会出现的键重复问题,而不是在运行时对重复的键进行过滤。
注意:如果一个文档没有对应的键,索引会将其作为null存储。所以,如果对某个键建立了唯一索引,但插入了多个缺少该索引键的文档,由于集合已经存在一个该索引键的值为null的文档而导致插入失败。
有些情况下,一个值可能无法被索引。索引储桶(indexbucket)的大小是有限制的,如果某个索引条目超出了它的限制,那么这个条目就不会包含在索引里。这样会造成一些困惑,因为使用这个索引进行查询时会有一个文档凭空消失不见了。所有的字段都必须小于1024字节,才能包含到索引里。如果一个文档的字段由于太大不能包含在索引里,MongoDB不会返回任何错误或者警告。也就是说,超出8 KB大小的键不会受到唯一索引的约束:可以插入多个同样的8KB长的字符串。
符合唯一索引:
也可以创建符合索引的唯一索引。创建符合唯一索引时,单个键的值可以相同,但所有键的组合值必须是唯一的。
去除重复:
在已有集合上创建唯一索引时可能会失败,因为集合中可能已经存在重复值了。
通常需要先对已有数据进行处理(可以使用聚合框架),找出重复的数据,想办法处理。
在极少数情况下,可能希望直接删除重复的值。创建索引时使用
dtrpDups
选项,如果遇到重复的值,第一个会被保留,之后的重复文档都会被删除。
dropDups
会强制性建立唯一索引,但是无法控制哪些文档被保留哪些文档被删除(MongoDB不会给出提示)。
唯一索引会把null看做值,所以无法将多个缺少唯一索引中的键的文档插入到集合中。然而,在有些情况下,可能希望唯一索引只对包含相应键的文档生效。如果有一个可能存在也可能不存在的字段,但是当它存在时,它必须是唯一的,这时就可以将
unique
和
sparse
选项组合在一起使用。
注意: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中指定索引的名称:
唯一索引唯一索引可以确保集合的每一个文档的指定键都有唯一值。例如,如果想保证文档的username键拥有不同的值,那么可以创建一个唯一索引:试图重复插入:发现有重复的键时抛出异常会影响效率,所以可以使用唯一索引来应对偶尔可能会出现的键重复问题,而不是在运行时对重复的键进行过滤。注意:如果一个文档没有对应的键,索引会将其作为null存储。所以,如果对某个键建立了唯一索引,但插入了多个缺少该索引键的文档,由于集合已经存在一个该索引键的值为null的文档而导致插入失败。有些情况下,一个值可能无法被索
偶然的一次机会,听到我们项目的API 调用方说请求超时,server 返回500,经查验说是交易的collection数据量太大(超过100GB),而且每天通过spring batch新增80w数据量,目前表的数据量已经过亿,有同事分析了查询说是通过
索引
会扫描大量的无效数据(此处默认通过id 排序分页),然后只能强制删除了大部分数据(目前是30GB)。
索引
优化
原先的查询语句如下...
其他注意事项
索引
支持
MongoDB
中查询的高效执行。如果没有
索引
,
MongoDB
必须执行集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。如果查询存在适当的
索引
,
MongoDB
可以使用
索引
来限制它必须检查的文档数。
索引
是特殊的数据结构[1],它以易于遍历的形式存储部分集合数据集。
索引
存储特定
字段
或
字段
集的值,按
字段
值排序。
索引
条目的排序支持高效的等值匹配和基于范围的查询操作
MongoDB
索引
索引
是一种用来快速查询数据的数据结构。B+Tree就是一种常见的数据库
索引
数据结构,
MongoDB
采用B+Tree
做
索引
,
索引
创建在collections上。
MongoDB
不使用
索引
的查询,先扫描所有的文档,再匹配符合条件的文档。使用
索引
的查询,通过
索引
找到文档,使用
索引
能够极大的提升查询效率。
一、
MongoDB
索引
数据结构
索引
数据结构介绍及官方文档
MongoDB
索引
数据结构具体使用的是B+Tree,因为B+Tree是B-Tree的子集,所以叫B-Tree也对,但是容易混淆
MongoDB
的
索引
与mysql的
索引
大致相同,但是由于
MongoDB
的特有性,比如文档可能不会存在某一个
字段
,文档有嵌套以及数组
类型
,所以也会有些许差异。为了测试数据,和demo的使用,单节点上创建一个1千万的文档,如下:
for(i=0; i<1000000; i++) {
db.user.insert({"i":i,"username":"user"+i,"age"...
我们收到了很多关于
索引
的问题。这一部分解答了其中的一小部分。有几点要记住。
第一,
MongoDB
索引
和MySQL
索引
非常相似并且对于MySQL的
索引
优化有很多也适用于
MongoDB
。
第二,更重要的是,这些
索引
的建议对你的应用提高也是有限的。
对于应用的最佳
索引
策略应该基于很多的重要因素。包含了你期望查询的
类型
,
要删除
MongoDB
集合中的
索引
,你可以使用 `db.collection.dropIndex()` 命令。
例如,假设你有一个名为 "users" 的集合,并且你想删除名为 "age_1" 的
索引
,你可以使用以下命令:
db.users.dropIndex("age_1")
如果你想删除集合中的所有
索引
,你可以使用 `db.collection.dropIndexes()` 命令。例如:
db.users.dropIndexes()
注意:删除
索引
可能会导致数据库性能下降,因此应谨慎使用。
programmer_ada:
Netty--Unpooled类
码不停T丨:
JPA--单表操作示例一、(增删改查)
小鹏鹏~: