我的开发环境中有一个查询,在dev mySQL数据库上运行通常需要1.7毫秒。当升级到Heroku和PostgreSQL时,同一个数据集上的同一个查询大约需要1.2秒!

SELECT distinct user_id, score, quality
FROM `reports`
WHERE (datetime_utc >= '2012-01-13 14:00:00' AND
       datetime_utc <= '2012-01-14 14:00:00')
ORDER BY score DESC, quality DESC LIMIT 20

我在score和quality上创建了一个复合索引,这对SQL版本有帮助,但是在PostgreSQL上运行的查询仍然非常非常慢。我的第一反应是检查索引是否在Heroku端,但我不太确定如何做到这一点——无论如何,我觉得这更多的是因为mySQL和PostgreSQL做的事情并不完全相同。
任何见解或建议都将非常感谢!

最佳答案

尝试此修改的查询:

SELECT user_id, score, quality
FROM   reports
WHERE  datetime_utc BETWEEN '2012-01-13 14:00:00' AND '2012-01-14 14:00:00'
GROUP  BY user_id, score, quality
ORDER  BY score DESC, quality DESC
LIMIT  20

因为DISTINCT是最后应用的,所以它可能比GROUP BY慢,有许多不明显的行。你必须用EXPLAIN ANALYZE来测试。否则,结果是一样的。
BETWEEN对WHERE子句进行了小的简化。删除了非标准MySQL语法。
很难使用(score, quality)上的索引。这里有用的索引是(在大多数情况下应该会有很大的不同):
CREATE INDEX reports_date_time_utc_idx ON reports (date_time_utc)

重要的是索引。

关于mysql - Rails 3.1-Heroku上的MySQL和PostgreSQL之间的巨大查询时间差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8796554/

10-11 03:32
查看更多