Mongo索引大全

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

索引

索引可以提升文档的查询速度,但建立索引的过程需要使用计算与存储资源,在已经建立索引的前提下,插入新的文档会引起索引顺序的重排

MongoDB 在创建集合时,会默认在\_id字段上创建唯一索引

该索引可防止客户端插入具有相同字段的两个文档,_id字段上的索引不能被删除


查询分析

查询过程中的winningPlan查询计划的stage属性描述查询命中索引的有关信息

阶段描述
COLLSCAN全表扫描
IXSCAN索引扫描
FETCH根据索引去检索指定document
PROJECTION限定返回字段
SHARD_MERGE将各个分片返回数据进行merge
SORT表明在内存中进行了排序
LIMIT使用limit限制返回数
SKIP使用skip进行跳过
IDHACK针对_id进行查询
SHARDING_FILTER通过mongos对分片数据进行查询
COUNT利用db.coll.explain().count()之类进行count运算
COUNTSCANcount不使用用Index进行count
COUNT_SCANcount使用了Index进行count
SUBPLA未使用到索引的$or查询
TEXT使用全文索引进行查询

单键索引

创建单键索引

db.records.createTndex({ field:1 })

查看使用索引情况

db.collection.find({field:value}).explain()

复合索引

复合索引结构包含多个字段,支持在多个字段上进行的匹配查询

db.collection.createIndex({ <field1> : <type>, <field2> : <type2>, ...})

查询表达不一定遵循指定的索引的顺序

并且数量上不一定全都满足

多键值索引

为包含数组的字段建立索引称为多键值索引,多键值索引支持对数组字段的高效查询

db.collecttion.createlndex( { <field>: < 1 or -1 > })
全文索引

文本索引支持对字符串内容的文本搜索查询,但是这种索引因为需要检索的文件比较多,因此在使用的时候检索时间较长

一个集合只能有一个文本搜索索引,但该索引可以覆盖多个字段

db.collection.createIndex({ field1: "text", field2: "text" ... })

查询需要使用$text结合$search完成

db.collection.find({$text:{$search:"test"}})

全文检索支持语言: https://docs.mongodb.com/manual/reference/text-search-languages/

散列索引

散列索引是指按照某个字段的散列值来建立索引,优势在于等值查询很快,所以只能用于字段完全匹配的查询,不能用于范围查询

db.collection.createlndex( { field : "hashed" })

索引参数

在每个索引的类别上还可以加上一些参数,使索引更加具有针对性,常见的参数包括稀疏索引、唯一索引、过期索引等

后台属性

建索引过程会阻塞其它数据库操作,background属性可以声明当前建立索引的过程为后台执行

默认值为false

db.collection.createlndex ({ "field" : 1 }, { background : true })
稀疏属性

只检索包含具有索引字段的文档,即使索引字段包含空值,检索时也会跳过所有缺少索引字段的文档,因为索引不包含集合的所有文档,所以说索引是稀疏的

相反,非稀疏索引包含集合中的所有文档,存储不包含索引字段的文档的空值

默认值为 false

db.collection.createlndex ({ "field" : 1 }, { sparse : true })
唯一属性

如果希望建立的索引同样具备唯一属性,那么可以使用unique

db.collection.createlndex ({ "field" : 1 }, { unique: true })
过期属性

MongoDB 可以用来在一定时间或特定时间后从集合中自动删除文档

注意,建立索引的字段应该是一个时间格式,删除动作将判断过期的描述expireAfterSeconds距设置字段的差值是否满足设定

db.collection.createIndex( { "time_field": 1 }, { expireAfterSeconds: 10 } )

需要注意的是,MongoDB 是每 60s 执行一次删除操作,因此短时间内执行会出现延迟现象

查看索引

查看集合上的所有索引

db.collection.getIndexes()

删除索引

删除某个索引

db.records.dropIndex({ "field" : 1 })

删除全部索引

db.records.dropIndexes()

修改索引

  1. 删除现有索引
  2. 重新创建索引

索引限制

索引不能被以下的查询使用:

  • 正则表达式及非操作符,如 $nin, $not, 等。
  • 算术运算符,如 $mod, 等。
  • $where 子句

  • 集合中索引不能超过64个
  • 索引名的长度不能超过128个字符
  • 一个复合索引最多可以有31个字段
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您提供一个基本的 Spring Boot 和 Mongo 索引的演示示例。 首先,您需要在您的 Spring Boot 应用程序中添加以下依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> ``` 然后,在您的 application.properties 或 application.yml 文件中添加此配置: ``` spring.data.mongodb.uri=mongodb://<username>:<password>@<hostname>:<port>/<database-name> ``` 您需要替换上述配置中的以下内容: - <username>:您的 MongoDB 用户名 - <password>:您的 MongoDB 密码 - <hostname>:您的 MongoDB 主机名 - <port>:您的 MongoDB 端口号 - <database-name>:您的 MongoDB 数据库名称 接下来,您可以创建一个简单的 Mongo 文档对象和一个 Mongo 存储库接口,如下所示: ``` @Document(collection = "users") public class User { @Id private String id; private String name; private int age; // getter 和 setter } @Repository public interface UserRepository extends MongoRepository<User, String> { List<User> findByName(String name); List<User> findByAgeGreaterThan(int age); } ``` 在这里,我们有一个名为 User 的 Mongo 文档对象,它包含 id、name 和 age 字段。然后,我们还有一个名为 UserRepository 的 Mongo 存储库接口,它继承自 MongoRepository,并带有两个自定义查询方法:findByName() 和 findByAgeGreaterThan()。 最后,我们可以使用以下代码在存储库中创建索引: ``` @Repository public interface UserRepository extends MongoRepository<User, String> { @Indexed(name = "name_index") List<User> findByName(String name); @Indexed(name = "age_index") List<User> findByAgeGreaterThan(int age); } ``` 在这里,我们在查询方法上使用了 @Indexed 注释,并为每个索引命名。使用命名的索引允许我们针对索引执行更多操作,例如删除或更新它们。 这就是一个基本的 Spring Boot 和 Mongo 索引的演示示例。希望能对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李恩泽的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值