与mongomapper的delayed_jobs很慢

时间:2011-12-13 10:09:38

标签: mongodb mongomapper

我正在使用带有mongomapper的delayed_jobs。但是,在获取delayed_jobs记录(大约500k记录)时速度很慢。

我正在运行创建索引{ locked_by: -1, priority: 1, run_at: 1 },但它没有帮助。

我真的不知道哪些索引可以改进查询。每次抓取大约需要2秒钟。

这是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

1 个答案:

答案 0 :(得分:0)

您的索引与查询不匹配。您的查询首先根据run_at删除了候选项,因此这应该是您的第一个索引,但事实并非如此。

然后是一个相当不优雅的$or条款。现在很难选择合适的索引,因为两个标准是locked_at而一个是locked_by

更糟糕的是,有三种排序标准,但它们与查询约束的方向完全相反。此外,你正在排序一个相当冗长的字符串。

基本上,我认为查询设计得不是很好,它试图在单个查询中完成太多。我不知道delayed_jobs是否是某种模块,但如果规则更简单则会更容易。例如,为什么工人会锁定这么多工作?事实上,我认为最好只锁定您当前正在处理的工作,并让不同的工作人员获取不同的工作类型以进行扩展。工作人员可能想要使用uuids而不是使用他们的ip地址和pid(前缀不添加熵和没有选择性),等等。