簡體   English   中英

簡單的Postgres查詢在Heroku上運行緩慢

[英]Simple Postgres queries running slow on Heroku

我有一個大約15,000個項目的Movie模型和一個3500的Dvd模型。

以下查詢是使用在Heroku上運行的Crane Postgres數據庫的簡單Rails關聯。 我想知道為什么以下查詢花了這么長時間,我怎么能最終減少它的時間。

2012-10-24T05:42:19+00:00 app[postgres]: [30-1] [BLACK] LOG:  duration: 57.914 ms  statement: SELECT  "movies".* FROM "movies"  WHERE "movies"."dvd_id" = 37 ORDER BY scene LIMIT 1
2012-10-24T05:42:20+00:00 app[postgres]: [31-1] [BLACK] LOG:  duration: 77.086 ms  statement: SELECT  "movies".* FROM "movies"  WHERE "movies"."dvd_id" = 915 ORDER BY scene LIMIT 1
2012-10-24T05:42:20+00:00 app[postgres]: [32-1] [BLACK] LOG:  duration: 85.602 ms  statement: SELECT  "movies".* FROM "movies"  WHERE "movies"."dvd_id" = 108 ORDER BY scene LIMIT 1
2012-10-24T05:42:21+00:00 app[postgres]: [33-1] [BLACK] LOG:  duration: 70.147 ms  statement: SELECT  "movies".* FROM "movies"  WHERE "movies"."dvd_id" = 11 ORDER BY scene LIMIT 1
2012-10-24T05:42:21+00:00 app[postgres]: [34-1] [BLACK] LOG:  duration: 144.204 ms  statement: SELECT  "movies".* FROM "movies"  WHERE "movies"."dvd_id" = 6 ORDER BY scene LIMIT 1
2012-10-24T05:42:22+00:00 app[postgres]: [35-1] [BLACK] LOG:  duration: 56.623 ms  statement: SELECT  "movies".* FROM "movies"  WHERE "movies"."dvd_id" = 1956 ORDER BY scene LIMIT 1
2012-10-24T05:42:23+00:00 app[postgres]: [36-1] [BLACK] LOG:  duration: 64.860 ms  statement: SELECT  "movies".* FROM "movies"  WHERE "movies"."dvd_id" = 747 ORDER BY scene LIMIT 1

您可以直接連接到數據庫CLI,然后使用PostgresQL EXPLAIN命令獲取有關如何運行查詢的信息。 這可以顯示您可以向表中添加索引以加快速度的位置。 Postgres的文檔說明(見我做什么呢?) EXPLAIN的更多細節。

您負責這些查詢的代碼是什么? 你正在使用急切加載嗎? 您的查詢應該是這樣的:

DVD.includes(:電影).where(無論如何)#assuming DVD有很多電影

這應該減少查詢/請求的數量。 到你的數據庫。 您的查詢表明您可能遇到N + 1問題。

您還應該在電影表上為dvd_id設置數據庫索引,因為它是外鍵。

確保你至少在dvd_id上有索引。 如果您可以在(dvd_id,scene)上創建復合索引,那么您的查詢將是完全最優的,無法進一步優化。

換句話說,就是執行

CREATE INDEX movies_dvd_id_scene_idx ON movies (dvd_id, scene);

你應該全力以赴

duration: 57.914 ms
duration: 77.086 ms
duration: 85.602 ms
duration: 70.147 ms
duration: 144.204 ms
duration: 56.623 ms
duration: 64.860 ms

平均而言(約80毫秒)這是在不同大洲運行查詢所需的通常持續時間。 確保您的Heroku應用程序和數據庫都托管在同一地區 (歐盟或美國)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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