Quan trọng nhất, bạn cần có chỉ mục trên playersinclubs(club_id, player_id)
. Phần còn lại là chi tiết (có thể vẫn tạo ra sự khác biệt khá lớn).
Bạn cần phải chính xác về mục tiêu thực tế của mình. Bạn viết:
Bạn không cần tham gia club
cho điều này:
SELECT p.*
FROM playersinclubs pc
JOIN player p ON p.id = pc.player_id
WHERE pc.club_id = 3;
Và bạn không cần cột playersinclubs
ở đầu ra, đây là một mức tăng nhỏ cho hiệu suất - trừ khi nó cho phép chỉ chỉ mục quét trên playersinclubs
, thì nó có thể là đáng kể.
Bạn có thể không cần tất cả các cột của player
kết quả là. Chỉ SELECT
các cột bạn thực sự cần.
PK trên player
cung cấp chỉ mục bạn cần trên bảng đó.
Bạn cần một chỉ mục trên playersinclubs(club_id, player_id)
, nhưng không làm cho nó trở nên độc đáo trừ khi người chơi không được phép tham gia cùng một câu lạc bộ lần thứ hai.
Nếu người chơi có thể tham gia nhiều lần và bạn chỉ muốn có danh sách "tất cả người chơi", bạn cũng cần thêm DISTINCT
bước để gấp các mục trùng lặp. Bạn chỉ có thể:
SELECT DISTINCT p.* ...
Nhưng vì bạn đang cố gắng tối ưu hóa hiệu suất nên sẽ rẻ hơn nếu loại bỏ sớm các hành vi gian lận:
SELECT p.*
FROM (
SELECT DISTINCT player_id
FROM playersinclubs
WHERE club_id = 3;
) pc
JOIN player p ON p.id = pc.player_id;
Có lẽ bạn thực sự muốn tất cả các mục nhập trong playersinclubs
và tất cả các cột của bảng. Nhưng mô tả của bạn nói khác. Truy vấn và chỉ mục sẽ khác nhau.
Câu trả lời có liên quan chặt chẽ: