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