![](/img/trans.png)
[英]huge difference between the running time of the same SQL query in java and mysql
[英]Rails 3.1 - huge query time difference between mySQL and PostgreSQL on Heroku
我在開發環境中有一個查詢,通常需要大約1.7毫秒才能在開發mySQL數據庫上運行。 當碰到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
我創建了分數和質量的復合索引,這對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)
重要的部分是索引。
性能差異是否可能由dev和heroku之間的數據集大小引起?
擁有得分索引,如果有很多行,質量將無濟於事,因為它仍然必須基於datetime_utc進行過濾。
您可能希望考慮datetime_utc上的索引,因為它需要首先在此處過濾。
如果您確實想優化讀取速度,則可以在datetime_utc,score,quality和user_id上使用復合索引,這將完全消除查找行數據的需要。
但是,請注意這樣做,因為這樣可能會導致索引如此寬的插入片段出現熱點。
因為Heroku不允許您連接到數據庫,除非具有每月200美元以上的計划之一,您可以嘗試檢索數據庫的本地副本以進行本地檢查。
heroku db:pull // Will give you a local copy of the db
結果將是這樣的:
Receiving schema
Receiving data
8 tables, 591 records
users: 100% |================================| Time: 00:00:00
pages: 100% |================================| Time: 00:00:00
comments: 100% |================================| Time: 00:00:00
tags: 100% |================================| Time: 00:00:00
Receiving indexes
Resetting sequences
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.