延时工作经常进行这样的查询 :
SELECT "delayed_jobs".*
FROM "delayed_jobs"
WHERE ((run_at <= 2012-05-23 15:16:43.180810 AND (locked_at IS NULL OR locked_at < 2012-05-23 11:16:43.180841 ) OR locked_by = host:foo pid:1 ) AND failed_at IS NULL)
ORDER BY priority ASC, run_at ASC LIMIT 5
我在我的大DB机器上的日志上说要花四分之一秒的时间才能运行。我可以在所选的栏目上投出一些索引,但是我也许可以从多栏指数中获得更多的性能。
我为这个查询能做的最优化的多列索引是什么? 是否有工具可以计算这个数据?
<强 > 更新 强 >
后加gres 版本: 9.1.3
1个现有指数:优先级,运行_at (名为“deleded_jobs_riority”)
explain 分析
出自 explain 分析
:
Limit (cost=0.00..219.65 rows=5 width=1154) (actual time=0.727..0.727 rows=0 loops=1)
-> Index Scan using delayed_jobs_priority on delayed_jobs (cost=0.00..351.43 rows=8 width=1154) (actual time=0.725..0.725 rows=0 loops=1)
Filter: ((failed_at IS NULL) AND (((run_at <= 2012-05-23 18:11:03.980113 ::timestamp without time zone) AND ((locked_at IS NULL) OR (locked_at < 2012-05-23 14:11:03.98014 ::timestamp without time zone))) OR ((locked_by)::text = host:foo pid:1 ::text)))
Total runtime: 0.754 ms
(4 rows)