2011-12-13 5 views
0

J'utilise delayed_jobs avec mongomapper. Cependant, il est lent lors de la récupération des enregistrements delayed_jobs (environ 500 000 enregistrements).delayed_jobs avec mongomapper est lent

Je cours pour créer des index { locked_by: -1, priority: 1, run_at: 1 }, mais cela n'aide pas.

Je ne sais vraiment pas quels index pour améliorer la requête. Chaque récupération prend environ 2 secondes.

Voici le journal de MongoDB:

Tue Dec 13 09:52:38 [conn497] query api_production.$cmd ntoreturn:1 command: { findandmodify: "delayed_jobs", query: { run_at: { $lte: new Date(1323769957289) }, failed_at: null, $or: [ { locked_by: "host:ip-10-128-145-246 pid:26157" }, { locked_at: null }, { locked_at: { $lt: new Date(1323769057289) } } ] }, sort: { locked_by: -1, priority: -1, run_at: 1 }, update: { $set: { locked_at: new Date(1323769957289), locked_by: "host:ip-10- 128-145-246 pid:26157" } } } reslen:699 1486ms

Répondre

0

Vos index ne correspondent pas à la requête. Votre requête élimine d'abord les candidats en fonction de run_at, ce qui devrait être votre premier index, mais ce n'est pas le cas.

Puis vient une clause plutôt inélégante $or. Maintenant, il sera difficile de choisir un index approprié, car deux critères sont locked_at tandis qu'un autre est locked_by.

Pour aggraver les choses, il existe trois critères de tri, mais ils sont exactement inverses de la direction des contraintes de requête. En outre, vous trier sur une chaîne plutôt longue.

Fondamentalement, je pense que la requête n'est pas très bien conçue, elle essaie d'accomplir trop de choses dans une seule requête. Je ne sais pas si delayed_jobs est une sorte de module, mais ce serait beaucoup plus simple si les règles étaient plus simples. Pourquoi un travailleur verrouille-t-il autant de tâches, par exemple? En fait, je pense qu'il est préférable que vous ne verrouilliez que le travail sur lequel vous travaillez actuellement et que différents travailleurs récupèrent différents types de travail pour la mise à l'échelle. Les travailleurs peuvent vouloir utiliser uuids au lieu d'utiliser leur adresse IP et pid (avec un préfixe qui n'ajoute aucune entropie et aucune sélectivité), etc.