Tôi đang xem xét việc thêm chỉ mục tổng hợp vào một bảng trong cơ sở dữ liệu MYSQL có khả năng sẽ có vài triệu hàng. Hỗn hợp sẽ bao gồm hai cột varchar cũng như ba cột int. Câu hỏi của tôi là như đã nêu trong tiêu đề: có một thứ tự tối ưu để tạo chỉ mục tổng hợp này không? Ví dụ, một trong các hàng int sẽ có khả năng chỉ có 6 giá trị có thể, nó sẽ tốt hơn cho cột đó gần hơn với mặt trước của định nghĩa chỉ mục? Tương tự như vậy, một trong các cột VARCHAR có thể sẽ có hàng triệu giá trị khác nhau, nên ở gần mặt trước hoặc mặt sau của định nghĩa chỉ mục?Có phương pháp tối ưu nào để đặt hàng chỉ mục tổng hợp MYSQL không?
Trả lời
Theo quy tắc chung, trong chỉ mục nhiều cột, bạn muốn các cột có số lượng thẻ cao nhất hoặc nói cách khác là số giá trị riêng biệt cao nhất, trước tiên sẽ xuất hiện trong chỉ mục.
Để chính xác hơn, bạn muốn cột có ít nhất có thể phù hợp với tiêu chí tìm kiếm của bạn trước tiên để bạn có thể thu hẹp kết quả được đặt càng nhiều càng tốt, nhưng nói chung, nó giống với số lượng thẻ cao nhất.
Vì vậy, trong ví dụ của bạn, bạn sẽ muốn cột có hàng triệu giá trị riêng biệt nằm trong chỉ mục trước chỉ mục có 6 giá trị riêng biệt.
Giả sử bạn chỉ chọn một hàng trong số hàng triệu giá trị, nó cho phép bạn loại bỏ nhiều hàng nhanh hơn.
Khi xem xét hai cột có số lượng thẻ tương tự, trước tiên hãy đặt cột nhỏ hơn (INTEGER cột trước cột VARCHAR) vì MySQL có thể so sánh và lặp qua chúng nhanh hơn. Một báo trước là nếu bạn đang chọn với phạm vi (ví dụ: WHERE datecol > NOW()
), thì bạn muốn các cột phạm vi xa nhất bên phải và các cột có một hằng số (ví dụ: WHERE id = 1
) ở bên trái. Điều này là do chỉ mục của bạn chỉ có thể được sử dụng để tìm kiếm và sắp xếp lên đến điểm của giá trị dải ô đầu tiên.
Cardinality không phải lúc nào cũng là tiêu chí đúng: Tôi có một bảng với chỉ mục nhiều cột trong đó cột đầu tiên trong chỉ mục chỉ có hai giá trị có thể, trong khi các cột tiếp theo có số lượng thẻ cao hơn. Điều này hoạt động vì chỉ mục được thiết kế cho một tìm kiếm cụ thể luôn sử dụng chỉ 1 trong 2 giá trị và giá trị đó làm giảm kết quả được đặt 95%. Câu hỏi phù hợp để hỏi là cột nào sẽ giảm kết quả được đặt nhiều nhất, và bản thân chỉ là một quy tắc hữu ích. –
@Kai, nhận xét của bạn làm tôi bối rối. Có lẽ bạn có thể đưa ra một ví dụ cụ thể. –
@MarcusAdams Tôi hiểu những gì Kai đang nói, tôi nghĩ rằng nó được giải thích khá tốt ở đây: http://www.percona.com/blog/2009/06/05/a-rule-of-thumb-for-choosing-column -order-in-indexes/ –
Bạn có đang chọn với các hằng số trong mệnh đề WHERE của bạn, trái ngược với một phạm vi không? –
Marcus, tôi có thể sẽ chọn các hằng số cho phần lớn truy vấn vào bảng này. – chicagoCrazy