Java MongoDB碎片删除数据非常慢
我发现我的MongoDB删除数据非常慢,但查询或插入操作可以 这是我的碎片状态:Java MongoDB碎片删除数据非常慢,java,spring,mongodb,spring-mongo,spring-mongodb,Java,Spring,Mongodb,Spring Mongo,Spring Mongodb,我发现我的MongoDB删除数据非常慢,但查询或插入操作可以 这是我的碎片状态: shards: { "_id" : "shard0000", "host" : "192.168.1.50:27017", "tags" : [ "global" ] } { "_id" : "shard0001", "host" : "192.168.2.50:27017", "tags" : [ "china" ] } 这两个数据库设置在不同的国家。但我确信我在测试中把所有数据都放在了同一个数据库
shards:
{ "_id" : "shard0000", "host" : "192.168.1.50:27017", "tags" : [ "global" ] }
{ "_id" : "shard0001", "host" : "192.168.2.50:27017", "tags" : [ "china" ] }
这两个数据库设置在不同的国家。但我确信我在测试中把所有数据都放在了同一个数据库中
这是记录结构:
{
"_id": ObjectId("56cd5cdae4b0323bc94339e6"),
"eventId": NumberLong(5680),
"opuId": NumberLong(2576),
"eventTime": ISODate("2016-02-24T07:33:46.471Z")},
{
"_id": ObjectId("56cd5cdae4b0323bc94339e7"),
"eventId": NumberLong(5681),
"opuId": NumberLong(2576),
"eventTime": ISODate("2016-02-24T07:34:46.471Z")}
我使用spring框架,下面是我的代码:
查询:
@Query(value = "{'eventId' : ?1}")
public Event findByEventId(long eventId);
删除:
mongoTemplate.remove(query(where("eventId").is(event.getEventId())), Event.class);
通常,保存或查询100条记录需要100毫秒。但逐个删除100条记录需要30秒
但是,如果我使用批删除,它花费不到50毫秒。看起来很正常
mongoTemplate.remove(query(where("opuId").is(opuId)), Event.class);
我找到了原因
由于我的shard key id为opuId,因此我将查询字符串编辑为:
mongoTemplate.remove(query(where("eventId").is(event.getEventId())
.andOperator(where("opuId").is(event.getOpuId()))), Event.class);
但我仍然不明白为什么查询可以不询问shard001,而删除却不行。你有“opuId”的索引吗?如果您运行db.collection.find({“opuId”:1234}).explain(),您会得到哪一个游标(默认值?)。查询是在eventId上运行的,它可能会被索引,甚至被用作碎片键,这可能解释了它为什么很快。