mongodb - 优化MongoDB索引(两字段查询)
问题描述
我有两个字段scheduledStamp
,email
在一个名为inventory
.
具有以下 jpa 查询:
fun findAllByScheduledStampAfterAndEmailEquals(scheduledStamp:Long,email:String):List<Inventory>
索引此集合的最佳方法是什么?
我希望尽可能少的索引,避免不必要的索引。
知道:
这个集合可以有超过百万个条目(需要索引)
查询人:
db.inventory.find({ scheduledStamp: {$gt:1594048295294}})
肯定的结果很少条目
查询人:
db.inventory.find({ email: "abc@gmail.com"})
肯定的结果很少条目
解决方案
如果您只需要支持对电子邮件的查询:索引电子邮件是必须的
如果您只需要在 scheduleStamp 上支持查询:必须索引 scheduleStamp
如果您想同时查询两者,则需要第三个索引。但是您可以创建一个复合索引来覆盖此查询和上述查询之一。
由于 Mongo 遵循前缀匹配来选择索引:
您可能在 {"email":1} 和 {"scheduledStamp:1","email":1} 上有索引
或者
您可能在 {"scheduledStamp":1} 和 {"email:1","scheduledStamp":1} 上有索引
但是,既然您说这些字段返回的文档很少:仅在 {"email":1} 和 {"scheduledStamp":1} 上有 2 个索引,即使不是最佳的,也可能表现良好。
推荐阅读
- java - 使用 Index API 同步将数千条记录索引到 Elasticsearch 是正确的方法吗?
- ios - 如何从 iPod 音乐库 (Swift 5) 中获取音频文件
- google-cloud-platform - 安排谷歌云功能(无触发器)
- python - 将 Jupyter 小部件下拉列表传递给第二个下拉列表
- javascript - 使用 Fetch,但在 URL 末尾有一个关键参数,用于 GET 和 POST
- maven - Maven 工具链和 Heroku/云部署
- java - 即使在递归调用之后也不会发生递归
- html - 如何在 Angular 6 组件中嵌入数据(PDF Base 64)
- python - 如何在python中创建一个if检查玩家的分数是否为10
- java - Jenkinsfile 任务失败 [不支持的类文件主要版本 57]