2016-02-24 1 views
0

J'ai trouvé mes données de suppression MongoDB est très lent, mais la requête ou l'insertion d'action est ok.MongoDB shard supprimer des données très lent

Ceci est mon statut de tesson:

shards: 
{ "_id" : "shard0000", "host" : "192.168.1.50:27017", "tags" : [ "global" ] } 
{ "_id" : "shard0001", "host" : "192.168.2.50:27017", "tags" : [ "china" ] } 

Les deux bases de données sont configurés dans différents pays. Mais je suis sûr que j'ai mis toutes les données à la même base de données dans mon test.

C'est la structure d'enregistrement:

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

J'utilise le cadre de printemps et voici mon code:

Requête:

@Query(value = "{'eventId' : ?1}") 
public Event findByEventId(long eventId); 

Supprimer:

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

En général , enregistrement ou requête 100 disques passeraient 100ms. Mais supprimer 100 enregistrements au cas par cas prend plus de 30 secondes. Mais si j'utilise la suppression par lots, elle passe moins de 50 ms. Ça a l'air normal.

mongoTemplate.remove(query(where("opuId").is(opuId)), Event.class); 
+0

Avez-vous un index pour "opuId"? Si vous exécutez db.collection.find ({"opuId": 1234}). explain() quel cursoer obtenez-vous (par défaut?) la requête est en cours d'exécution sur eventId qui est probablement indexé ou même utilisé comme une clé de partition qui explique probablement pourquoi c'est rapide. –

Répondre

0

J'ai trouvé la raison.

Parce que mon tesson clé id opuId, je modifier la chaîne de requête à:

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

Mais je ne comprends toujours pas pourquoi l'interrogation peut faire sans demander shard0001, mais la suppression ne fonctionne pas.