SELECT * FROM users,
(SELECT *
FROM mastery
WHERE champion_rank = 1
ORDER BY global_rank ASC
LIMIT 3) as ranks
WHERE users.id = ranks.user_id
マスタリーは22M行とユーザーがいる500万行を持っています。上記のクエリは1800msで完了します。
問題は、それ自体で実行すると、サブクエリ次だから、理論的にもし2.5msで
SELECT * FROM users WHERE id = 4234523
SELECT *
FROM mastery
WHERE champion_rank = 1
ORDER BY global_rank ASC
LIMIT 3
を実行するために、ユーザーテーブルから単一のユーザーを取得するために、2.5msでかかりかかることです私はちょうど最初のサブクエリを行うために自分のコードを変更し、その後、返された各行に対して、処理全体が2.5 +(3 * 2.5)= 10ミリ秒かかるという追加クエリを実行します。
確かにpostgresは何か変わったことをしていますか?
構造とデータベースのインデックスが、それはユーザーが500万行の上でそれぞれにソートされたサブクエリを実行する必要があるためhere
なぜ結合を使用しないのですか?また、テーブルにインデックスを置いていますか? – JanR
http://stackoverflow.com/tags/postgresql-performance/infoとhttp://wiki.postgresql.org/wiki/SlowQueryQuestionsを読んで質問を編集し、不足している情報を追加してください –