sql >> データベース >  >> RDS >> PostgreSQL

多対多のテーブル-パフォーマンスが悪い

    最も重要なのは、playersinclubs(club_id, player_id)インデックスが必要です 。残りは詳細です(それでもかなりの違いが生じる可能性があります)。
    実際の目標について正確にする必要があります。あなたが書く:

    clubに参加する必要はありません このために:

    SELECT p.* 
    FROM   playersinclubs pc
    JOIN   player         p ON p.id = pc.player_id
    WHERE  pc.club_id = 3;
    

    また、列は必要ありませんplayersinclubs 出力でも、これはパフォーマンスのわずかな向上です。ただし、インデックスのみが許可されている場合を除きます。 playersinclubsでスキャン 、それならかなりの量になるかもしれません。

    おそらくすべては必要ありません playerの列 結果としても。 SELECTのみ 実際に必要な列。

    playerのPK そのテーブルに必要なインデックスを提供します。

    playersinclubs(club_id, player_id)のインデックスが必要です 、ただししない プレーヤーが同じクラブに2回参加することを許可されていない限り、それをユニークにします。

    プレーヤーが複数回参加でき、「すべてのプレーヤー」のリストが必要な場合は、DISTINCTも追加する必要があります。 重複するエントリを折りたたむ手順。あなたはただ:

    SELECT DISTINCT p.* ...
    

    ただし、パフォーマンスを最適化しようとしているため、重複を早期に排除する方が安価です:

    SELECT p.*
    FROM  (
       SELECT DISTINCT player_id
       FROM   playersinclubs
       WHERE  club_id = 3;
       ) pc
    JOIN   player p ON p.id = pc.player_id;
    

    たぶんあなたは本当にすべてが欲しい playersinclubsのエントリ テーブルのすべての列も。しかし、あなたの説明はそうではないと言っています。クエリとインデックスは異なります。

    密接に関連する答え:



    1. PostgreSQL(psql)でヌル出力の現在の設定を表示する方法

    2. mysqlのINTOOUTFILEを使用せずにmysqlからcsvに

    3. OracleEBSパスワードの有効期限/ポリシー/設定に関する便利なクエリ

    4. mysqlデータベースで出現するすべての文字列を検索します