我在类级别使用Spring Data Mongo的@Indexed
注释,后跟@Document
。
我从日志中注意到,每次建立与Mongo DB的连接时,都会创建索引。
这是正常行为吗,会不会在数据库上造成过载?
请让我理解@Indexed
批注的生命周期,是否可以忽略索引创建(如果已创建)?
我找不到与此相关的任何文档。
答案 0 :(得分:1)
使用@Indexed
可确保在首次访问创建声明索引的实体时使用。 Spring Data MongoDB的IndexOperations
调用createIndex(…)
。通常,一旦索引存在于给定的规范中,则此操作为空。通常适用于启动并运行很长时间的应用程序。
AWS Lambda会清理不热的实例以释放资源。我不确定这会如何影响您调用例如MongoDB的性能createIndex(…)
每分钟左右。如果您没有看到负面影响,那可能就好了。
在MongoDB上创建索引会准备一个排他锁(IX,意为排他锁),并在创建索引期间升级该锁。如果有足够的进程尝试调用createIndex(…)
,这可能会产生影响。
有哪些替代方案?
@Indexed
并将索引创建移至带外进程(在外部创建索引)@Indexed
并以编程方式创建索引(此建议的方法可为您提供最大的灵活性。您可以检查所需的索引是否已存在并跳过索引的创建)。 另请参阅:
db.collection.createIndex(…)
答案 1 :(得分:1)
从2.2.x版开始,您可以使用名为-spring.data.mongodb.autoIndexCreation:true / false
的属性来控制服务器启动时创建索引的行为。答案 2 :(得分:0)
据我所知,无论您做什么,应用程序都会调用命令来创建索引(新索引或已经退出)。而且此过程对于应用程序的运行并确保所有操作都很有用。关于此命令在MongoDb中的功能,让我们进一步了解一下
索引的作用以及如何工作(https://en.wikipedia.org/wiki/Database_index) 排序:制作一份副本并发出命令(使用规则的所有内容都将有助于加快搜索速度) 可能是B树或其他结构
createIndex命令将做什么? https://jira.mongodb.org/browse/SERVER-12699 https://jira.mongodb.org/browse/SERVER-10879 这两个问题使这一点很清楚,它不会做已经退出的同一件事。 因此逻辑很简单。
应用程序:我想要一些东西(创建索引并确保它在那里) 〜>我应该叫CreateIndex
MongoDb:使用命令: -我看到它是新的:创建它 -我看到它重复了:哦,转储操作,我将跳过此操作并通知您。
这是我对此问题的快速研究