10

Tôi có một bảng chỉ số mà tôi mong đợi là rất lớn. Nó có một liên kết đa hình để nó có thể thuộc về các mô hình khác muốn ghi lại một số chỉ số. Tôi thường chỉ mục các cột liên kết như thế này để tăng tốc độ tải liên kết. I've heard people talking about joint-indexing this association. Này trông giống như:Tôi có nên liên kết chỉ mục một liên kết đa hình ActiveRecord không?

add_index :comments, [:commentable_type, :commentable_id]

But I've also heard counsel against creating indexes of low-cardinality, vì phần thưởng của chỉ số không bù đắp các chi phí của việc duy trì nó. Vì nửa _type của hiệp hội đa hình của tôi có lẽ sẽ chỉ có 4-5 giá trị trên hàng triệu hàng, tôi có xu hướng chỉ lập chỉ mục trên phần _id của liên kết đa hình. Tôi có thể sẽ tạo ra một số chỉ mục chung bổ sung bằng cách sử dụng cột _id và một số cột số nguyên không có số liệu và các cột datetime khác, nhưng tôi sẽ không bao gồm _type trong các chỉ mục này.

Đây có phải là những gì bạn sẽ làm/đề xuất không?

Trả lời

5

Cuối cùng, đây là giá trị điểm chuẩn trước và sau khi thêm chỉ mục, trên tập dữ liệu thực tế - thực tế về kích thước và dữ liệu.

Tuy nhiên, bạn không tạo chỉ mục trên một trường chỉ với một vài giá trị. Chỉ mục nằm trên sự kết hợp của hai trường, có khả năng có số lượng của các kết hợp giá trị khác nhau. Chỉ số trên các trường kết hợp là một ý tưởng thông minh.

3

Cách tốt nhất là đặt trường chọn lọc nhất trước tiên khi tạo chỉ mục trên nhiều trường. Vì bạn chỉ có 4-5 giá trị của commentable_type, bạn nên làm tốt hơn:

add_index :comments, [:commentable_id, :commentable_type] 
+1

bạn có thể làm rõ ý bạn là "có chọn lọc nhất" không? – GMA

+0

@GMA rất có thể bạn sẽ có rất nhiều bản ghi loại, nhưng số lượng các loại sẽ khá hạn chế, có nghĩa là chỉ có một vài hàng có cùng giá trị commentable_id, trong khi hàng nghìn và hàng có cùng commentable_type, có nghĩa là rằng commentable_id có nhiều lựa chọn hơn –

Các vấn đề liên quan