Yang terpenting, Anda memerlukan indeks di playersinclubs(club_id, player_id)
. Sisanya adalah detail (yang mungkin masih membuat perbedaan besar).
Anda harus tepat tentang tujuan Anda yang sebenarnya. Anda menulis:
Anda tidak perlu bergabung ke club
untuk ini sama sekali:
SELECT p.*
FROM playersinclubs pc
JOIN player p ON p.id = pc.player_id
WHERE pc.club_id = 3;
Dan Anda tidak perlu kolom playersinclubs
di output juga, yang merupakan keuntungan kecil untuk kinerja - kecuali jika memungkinkan hanya indeks pindai di playersinclubs
, maka itu mungkin penting.
Anda mungkin tidak membutuhkan semua kolom player
dalam hasil, baik. Hanya SELECT
kolom yang benar-benar Anda butuhkan.
PK di player
menyediakan indeks yang Anda butuhkan di tabel itu.
Anda memerlukan indeks di playersinclubs(club_id, player_id)
, tetapi jangan membuatnya unik kecuali pemain tidak diizinkan untuk bergabung dengan klub yang sama untuk kedua kalinya.
Jika pemain dapat bergabung beberapa kali dan Anda hanya ingin daftar "semua pemain", Anda juga perlu menambahkan DISTINCT
langkah untuk melipat entri duplikat. Anda bisa saja:
SELECT DISTINCT p.* ...
Tetapi karena Anda mencoba mengoptimalkan kinerja:lebih murah untuk menghilangkan penipuan lebih awal:
SELECT p.*
FROM (
SELECT DISTINCT player_id
FROM playersinclubs
WHERE club_id = 3;
) pc
JOIN player p ON p.id = pc.player_id;
Mungkin Anda benar-benar menginginkan semua entri di playersinclubs
dan semua kolom tabel juga. Tapi deskripsi Anda mengatakan sebaliknya. Kueri dan indeks akan berbeda.
Jawaban yang terkait erat: