Từ nghiên cứu của riêng tôi (nhưng tôi không phải là chuyên gia về DBA), tôi đã học được rằng có hai điều cần xem xét khi quyết định thứ tự của một chỉ mục khóa ghép.
Đầu tiên, liên quan đến bản số của các cột, chỉ mục thường tốt hơn trong việc tìm kiếm các cột có bản số cao. Vì vậy, tôi sẽ có xu hướng đặt cột có số lượng cao nhất đầu tiên trong chỉ mục. Để tham khảo, có một bài báo có tiêu đề Tối ưu hóa truy vấn MySQL điều đó nói rằng:
Trong trường hợp của bạn, _id
rõ ràng các cột sẽ phù hợp hơn với định nghĩa đó, do đó chúng là ứng cử viên tốt hơn để trở thành tiền tố của khóa.
Một điều khác cần xem xét là khả năng tái sử dụng của các chỉ mục này. Hầu hết (nếu không phải tất cả) hệ thống cơ sở dữ liệu cho phép sử dụng lại tiền tố của khóa ghép. Ví dụ:một khóa ghép trên (owner_id, owner_type)
cũng có thể được sử dụng bởi các truy vấn trên owner_id
nhưng không có trên owner_type
.
Vì vậy, từ những gì bạn đã giải thích trong câu hỏi của mình, bạn có thể tốt hơn với hai chỉ mục:chỉ mục khóa ghép trên (owner_id, owner_type)
và một cái khác trên (owner_type)
.
Cuối cùng, tất cả đều thuộc về tập dữ liệu và các truy vấn của bạn. Hãy thử nhiều kịch bản, điểm chuẩn bằng cách sử dụng thứ tự khóa ghép khác nhau để xem đâu là giải pháp tối ưu nhất. Ngoài ra, đừng quên rằng các chỉ mục phải chịu hình phạt ghi trên bảng của bạn.
Cập nhật :Cũng có một câu hỏi SO khá phổ biến khác về chỉ mục khóa ghép ở đó:
Khi nào tôi nên sử dụng chỉ mục tổng hợp?