3

データベース内のいくつかのCDをIDで検索するコードがあります。これは、「IN」条件を使用して行われます。

(1) SELECT * FROM album WHERE id IN (?,?,?,?,?)

次のステップは、これらのアルバムに関連付けられたトラックを取得することです。これを行うには、「base」クエリを少し変更します。

(2) SELECT track.* FROM album 
LEFT JOIN track ON track.album_id = album.id 
WHERE album.id IN(?,?,?,?,?)

今、私はアルバムとトラックの両方を持っています。ただし、トラックの作曲家の詳細をロードする必要があります。いくつかの理由で、上記のクエリと一緒に実行できないため、個別に実行する必要があります。

私にできることは、取得したトラックに基づいて作曲家を検索することです。ここで、トラックIDを使用し、これらのトラックIDに基づいて作曲家テーブルで作曲家を検索します。または、「base」クエリをさらに変更して、composersテーブルともう1つ結合することもできます。でも; ここに(パフォーマンスに関して)クエリの1つを好ましいものとして簡単に指摘する一般的なルールはありますか?私は少しテストを行ってきましたが、実際には何の違いも見られないほど小規模でテストしました...

(3) SELECT composer.* FROM album 
LEFT JOIN track ON track.album_id = album.id
LEFT JOIN composer ON composer.track_id = track.id
WHERE album.id IN (?,?,?,?,?)

...また...

[get track ids from query (2)]

(4) SELECT composer.* FROM composer
WHERE composer.track_id IN (?,...);

記録のために:すべての基準と結合列にインデックスを設定しました。

4

1 に答える 1

5

LEFT JOIN作曲家だけを気にするので、クエリ3で使用する理由はありません(番号を付けるのはいいことです)。(一般に、外部結合は遅くなります。)

クエリ3でalbumsテーブルに参加する必要はありません。onを使用するだけINですtrack.album_id。(アルバムが欠落している不正なトラックについては心配していないと思います。)

いろいろなことにインデックスがあるとおっしゃいました。ただし、MySQLはクエリごとにテーブルごとに1つのインデックスしか使用できないことに注意してください。したがって、チェックすることが複数ある場合は、複合インデックスを作成する必要があります。

驚くべきことに、通常、結合を行う方が大きなINステートメントよりも高速です。これは、INの値にインデックスが付けられていないため、MySQLがそれらに対してインデックス結合を行うことができないためです。ただし、これは多くの値にのみ適用されます。INを使用する値が少ない場合は、より高速になる可能性があります。

個人的には、このクエリが問題になるまでJOINメソッドを使用します。(これは、チェックする条件が非常に複雑な場合にのみ発生し、2回実行すると遅くなる可能性があります)。結合はより単純なコードであり、おそらく超高速になります。したがって、特別な理由がない限り、物事をより複雑にしないでください。

于 2012-08-29T07:54:06.113 に答える