2016-02-24 4 views
0

Я нашел, что мои MongoDB удаляют данные очень медленно, но запрос или вставка действия в порядке.MongoDB shard удалить данные очень медленно

Это мой статус осколок:

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")} 

Я использую рамки весной и вот мой код:

Запрос:

@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); 
+0

У вас есть указатель на «opuId»? если вы запустите db.collection.find ({«opuId»: 1234}). Объясните(), какой cursoer вы получаете (по умолчанию?), запрос выполняется на eventId, который, вероятно, индексируется или даже используется как ключ осколка, который, вероятно, объясняет почему это быстро. –

ответ

0

Я нашел причину.

Поскольку мой осколок ключ ID opuId, отредактировать строку запроса на:

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

Но я до сих пор не могу понять, почему запрос может обойтись без спрашивать shard0001, но удаление не делает.

Смежные вопросы