複数の結合を使用してSQLクエリを高速化する助けをしたいと思います。私が取り出そうとしているのは、最新の対応するページ、アイテム、クラブを持つすべてのユーザーフィールドに相当します。以下のクエリは問題なく動作しますが、数秒かかることがあります。 user_idのすべての外部キーフィールド、Userクラス、およびそれがフィルタリングしている大学のフィールドにインデックスを追加しましたが、それほど助けにはなりませんでした。複数の左外部結合SQLクエリの高速化
私はすべてのユーザーを取得したいので、私は単純な内部結合を行うことはできませんと考えています。各ユーザーには、0ページから多くのページ、アイテム、およびクラブがあります。私はあなたが適切なインデックスとクエリを向上させることができると思い
SQLテーブル
User
id
first_name
last_name
class
college
Page
id
user_id
created_at
page_text
Item
id
user_id
created_at
item_text
Club
id
user_id
created_at
club_text
現在の作業が、スロークエリ
SELECT u.id,u.first_name,u.last_name,p.page_text,i.item_text,c.club_text FROM user u LEFT OUTER JOIN LATERAL \
(SELECT page_text FROM page p2 WHERE u.id = p2.user_id ORDER BY p2.created_at DESC LIMIT 1) p ON TRUE LEFT OUTER JOIN LATERAL \
(SELECT item_text FROM item i2 WHERE u.id = i2.user_id ORDER BY i2.created_at DESC LIMIT 1) i ON TRUE LEFT OUTER JOIN LATERAL \
(SELECT club_text FROM club c2 WHERE u.id = c2.user_id ORDER BY c2.created_at DESC LIMIT 1) c ON TRUE \
WHERE u.class = 'Senior' AND u.college = 'University' ORDER BY u.first_name;
おかげで、私が思ったように私は、外部キーのインデックスを作成しなかっ判明私は持っていた。修正後、クエリの速度が大幅に向上します。これらのフィールドで、まだインデックスされている他の列に基づいて検索する以外の理由から、ページ(page_text)、アイテム(item_text)、およびクラブ(club_text)のインデックスが必要な理由を説明できますか? – user1071182
@ user1071182 。 。これらの単一列索引がなぜ役立つのかわかりません。 –
おそらく私はあなたの返事を誤解していて、私は今では – user1071182