MongoDB分片删除数据非常慢

时间:2016-02-24 07:46:37

标签: 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" ] }

这两个数据库设置在不同的国家/地区。但我确信我在测试中将所有数据都放在同一个数据库中。

这是记录结构:

{
"_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);

1 个答案:

答案 0 :(得分:0)

我找到了原因。

因为我的分片键id opuId,我将查询字符串编辑为:

mongoTemplate.remove(query(where("eventId").is(event.getEventId())
                    .andOperator(where("opuId").is(event.getOpuId()))), Event.class);

但我仍然无法理解为什么查询可以在不询问shard0001的情况下进行,但删除不会。