Tôi phần nào biết câu trả lời cho câu hỏi này rồi, nhưng tôi luôn cảm thấy như thể có nhiều hơn tôi cần chọn về chủ đề này.
Hiểu biết cơ bản của tôi là nói chung, một chỉ mục duy nhất bao gồm tất cả các lĩnh vực bạn có thể truy vấn / sắp xếp tại bất kỳ thời điểm nào có thể không hữu ích, nhưng tôi đã thấy loại điều này. Như trong, có người nghĩ, "Chà, nếu chúng ta chỉ đưa tất cả những thứ này vào một chỉ mục, cơ sở dữ liệu có thể sử dụng nó để tìm những gì nó cần", mà không bao giờ thấy một kế hoạch thực hiện cho một số truy vấn thực tế đang được chạy.
Hãy tưởng tượng một bảng như vậy:
id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime
Tôi có thể thấy một chỉ số duy nhất bao gồm cả name
, customerId
và dateCreated
các lĩnh vực.
Nhưng sự hiểu biết của tôi là một chỉ mục như vậy sẽ không được sử dụng trong một truy vấn như, ví dụ:
SELECT [id], [name], [customerId], [dateCreated]
FROM Representatives WHERE customerId=1
ORDER BY dateCreated
Đối với một truy vấn như vậy, đối với tôi, một ý tưởng tốt hơn sẽ là một chỉ mục bao gồm các trường customerId
và dateCreated
các trường, với customerId
trường là 'đầu tiên'. Điều này sẽ tạo ra một chỉ mục có dữ liệu được sắp xếp theo cách mà truy vấn này có thể nhanh chóng tìm thấy những gì nó cần - theo thứ tự mà nó cần.
Một điều khác tôi thấy, có lẽ thường xuyên như lần đầu tiên, là các chỉ mục riêng lẻ trên mỗi lĩnh vực; như vậy, một trong mỗi ngày name
, customerId
và dateCreated
các lĩnh vực.
Không giống như ví dụ đầu tiên, kiểu sắp xếp này đôi khi đối với tôi ít nhất là hữu ích một phần; kế hoạch thực hiện của truy vấn có thể cho thấy rằng ít nhất là nó sử dụng chỉ mục trên customerId
để chọn các bản ghi, nhưng nó không sử dụng chỉ mục với dateCreated
trường để sắp xếp chúng.
Tôi biết đây là một câu hỏi rộng, bởi vì câu trả lời cụ thể cho bất kỳ truy vấn cụ thể nào trên bất kỳ nhóm bảng cụ thể nào thường là để xem kế hoạch thực hiện nói rằng nó sẽ làm gì, và nếu không, hãy đưa các chi tiết cụ thể của bảng và truy vấn vào tài khoản. Ngoài ra, tôi biết rằng nó phụ thuộc vào tần suất truy vấn có thể được chạy trái ngược với chi phí duy trì một chỉ mục cụ thể cho nó.
Nhưng tôi cho rằng những gì tôi đang hỏi là 'điểm bắt đầu' chung cho các chỉ mục, ý tưởng về việc có các chỉ mục cụ thể cho các truy vấn cụ thể, thường xuyên được kéo và các trường trong mệnh đề WHERE hoặc ORDER BY có hợp lý không?