我正在使用带有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
答案 0 :(得分:0)
您的索引与查询不匹配。您的查询首先根据run_at
删除了候选项,因此这应该是您的第一个索引,但事实并非如此。
然后是一个相当不优雅的$or
条款。现在很难选择合适的索引,因为两个标准是locked_at
而一个是locked_by
。
更糟糕的是,有三种排序标准,但它们与查询约束的方向完全相反。此外,你正在排序一个相当冗长的字符串。
基本上,我认为查询设计得不是很好,它试图在单个查询中完成太多。我不知道delayed_jobs
是否是某种模块,但如果规则更简单则会更容易。例如,为什么工人会锁定这么多工作?事实上,我认为最好只锁定您当前正在处理的工作,并让不同的工作人员获取不同的工作类型以进行扩展。工作人员可能想要使用uuids而不是使用他们的ip地址和pid(前缀不添加熵和没有选择性),等等。