Nếu bảng User
của tôi có một số trường có thể truy vấn (ví dụ: DepartmentId, GroupId, RoleId), nó sẽ tạo ra bất kỳ sự khác biệt về tốc độ nào nếu tôi tạo chỉ mục cho từng kết hợp của các trường đó?Có cần phải có chỉ mục trên mọi kết hợp các trường có thể truy vấn trong bảng SQL để tối ưu hóa hiệu suất không?
Bằng "truy vấn", tôi đang đề cập đến màn hình truy vấn nơi người dùng cuối có thể chọn bản ghi dựa trên Bộ, Nhóm hoặc Vai trò bằng cách chọn từ menu thả xuống.
Hiện tại, tôi có chỉ mục trên DepartmentId, GroupId và RoleId. Đó là một chỉ mục không duy nhất cho mỗi trường.
Nếu một người dùng cuối lựa chọn "bất cứ ai trong nhóm B", SQL trông giống như:
select * from User where GroupId = 2
Có một chỉ mục trên GROUPID nên tốc độ đó lên.
Nhưng nếu người dùng cuối chọn "bất cứ ai trong nhóm B và trong Role C", SQL sẽ trông như thế này:
select * from User where GroupId = 2 and RoleId = 3
Có chỉ số trên GROUPID và Id vai trò cá nhân có thể không thực hiện bất kỳ sự khác biệt, phải không?
Chỉ mục tốt hơn cho tìm kiếm đó sẽ là nếu tôi có một chỉ mục trải rộng cả hai GroupId và RoleId.
Nhưng nếu đúng như vậy, điều đó có nghĩa là tôi sẽ cần có chỉ mục cho mọi kết hợp các trường có thể truy vấn. Vì vậy, tôi sẽ cần tất cả các chỉ số:
- DepartmentId
- groupId
- Id vai trò
- DepartmentId và groupId
- DepartmentId và Id vai trò
- groupId và Id vai trò
- cục Id, groupId và Id vai trò
Có ai có thể làm sáng tỏ điều này không? Tôi đang sử dụng MySQL nếu điều đó tạo nên sự khác biệt.
Hãy nhớ rằng thứ tự của các cột quan trọng - (GroupId, RoleId) là * không * giống như (RoleId, GroupId). Vì vậy, danh sách của bạn thiếu một số chỉ dẫn bổ sung.Nếu không, nhận xét của @ Joe về việc hợp nhất chỉ mục là tốt (DB2 cũng sử dụng điều này, để có hiệu quả tốt). –