簡體   English   中英

Rails 3.1-Heroku上的MySQL和PostgreSQL之間的巨大查詢時間差

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM