2010-01-21 31 views
29

Tôi chủ yếu là một nhà phát triển Actionscript và không có nghĩa là một chuyên gia trong SQL, nhưng theo thời gian tôi phải phát triển các công cụ phía máy chủ đơn giản. Vì vậy, tôi nghĩ rằng tôi muốn hỏi những người có kinh nghiệm hơn về câu hỏi trong tiêu đề.Có ý nghĩa gì khi sử dụng một chỉ mục sẽ có một số lượng cardinality thấp?

Sự hiểu biết của tôi là bạn không đạt được nhiều bằng cách đặt chỉ mục trong cột sẽ giữ một vài giá trị riêng biệt. Tôi có một cột chứa một giá trị boolean (thực sự nó là một int nhỏ, nhưng tôi đang sử dụng nó như một lá cờ), và cột này được sử dụng trong mệnh đề WHERE của hầu hết các truy vấn tôi có. Trong một trường hợp "trung bình" lý thuyết, một nửa giá trị của các bản ghi sẽ là 1 và nửa còn lại, 0. Vì vậy, trong trường hợp này, cơ sở dữ liệu có thể tránh quét toàn bộ bảng, nhưng sẽ phải đọc rất nhiều hàng (tổng số hàng/2).

Vì vậy, tôi có nên đặt cột này thành chỉ mục không?

Để ghi lại, tôi đang sử dụng Mysql 5, nhưng tôi quan tâm nhiều hơn đến lý do chung về lý do tại sao nó không có ý nghĩa lập chỉ mục một cột mà tôi biết rằng sẽ có một số lượng cardinality thấp.

Xin cảm ơn trước.

Trả lời

2

Tôi thường thực hiện kiểm tra chỉ mục "có chỉ mục" so với "không có" chỉ mục đơn giản. Theo kinh nghiệm của tôi, bạn nhận được hầu hết hiệu suất trên các truy vấn sử dụng ORDER BY cột được lập chỉ mục. Trong trường hợp bạn có bất kỳ phân loại nào trên cột đó, việc lập chỉ mục rất có thể sẽ hữu ích.

+0

Cảm ơn câu trả lời của bạn. Trong trường hợp này, tôi không phân loại cột đó. Nó chỉ ở đó để đánh dấu một bản ghi là đã bật/tắt. Tôi đang sử dụng nó để xóa phần mềm, về cơ bản. Đó là lý do tại sao tôi phải sử dụng nó trong mệnh đề WHERE của hầu hết các truy vấn. –

2

IMHO có tính hữu dụng hạn chế. Tôi cho rằng trong hầu hết các trường hợp, có các tiêu chí khác mà bạn đang sử dụng trong các truy vấn của mình ngoài cờ có thể giúp ích nhiều hơn.

Ở mức 50%, tôi có thể thực hiện một số điểm chuẩn có/không và xem liệu nó có khác biệt nhiều hay không.

8

Có thể đáng giá bao gồm trường boolean trong chỉ mục tổng hợp. Ví dụ nếu bạn có một bảng lớn các tin nhắn mà thường cần phải được sắp xếp theo ngày, nhưng bạn cũng có một boolean lĩnh vực Deleted, vì vậy bạn thường truy vấn nó như thế này:

SELECT ... FROM Messages WHERE Deleted = 0 AND Date BETWEEN @start AND @end 

Bạn chắc chắn sẽ được hưởng lợi từ việc chỉ mục tổng hợp trên các trường Đã xóaNgày.

+0

Cảm ơn. Có lẽ tôi nên làm một số nghiên cứu về các chỉ số tổng hợp (tôi chỉ biết sự tồn tại, nhưng chưa sử dụng chúng nhiều lắm). Tôi đang sử dụng cột này theo cách rất giống với mã mẫu của bạn (mặc dù có các kết nối và các công cụ khác, nhưng mệnh đề WHERE luôn có cờ này để đánh dấu xóa mềm). –

56

Một chỉ số có thể giúp ngay cả trên lĩnh vực cardinality thấp nếu:

  1. Khi một trong những giá trị có thể là rất hiếm khi xảy ra so với các giá trị khác và bạn tìm kiếm nó.

    Ví dụ, có rất ít màu sắc phụ nữ mù, do đó truy vấn này:

    SELECT * 
    FROM color_blind_people 
    WHERE gender = 'F' 
    

    có lẽ hầu hết sẽ được hưởng lợi từ một chỉ mục trên gender.

  2. Khi các giá trị có xu hướng được nhóm lại theo thứ tự bảng:

    SELECT * 
    FROM records_from_2008 
    WHERE year = 2010 
    LIMIT 1 
    

    Mặc dù chỉ có 3 năm khác biệt ở đây, hồ sơ với năm trước có lẽ nhất được bổ sung đầu tiên như vậy rất nhiều hồ sơ sẽ phải được quét trước khi trả lại bản ghi 2010 đầu tiên nếu không có chỉ mục.

  3. Khi bạn cần ORDER BY/LIMIT:

    SELECT * 
    FROM people 
    ORDER BY 
         gender, id 
    LIMIT 1 
    

    Nếu không có chỉ mục, một filesort sẽ được yêu cầu. Mặc dù nó phần nào tối ưu hóa làm cho LIMIT, nó vẫn sẽ cần một quét bảng đầy đủ.

  4. Khi chỉ số bao gồm tất cả các lĩnh vực được sử dụng trong truy vấn:

    CREATE INDEX (low_cardinality_record, value) 
    
    SELECT SUM(value) 
    FROM mytable 
    WHERE low_cardinality_record = 3 
    
  5. Khi bạn cần DISTINCT:

    SELECT DISTINCT color 
    FROM tshirts 
    

    MySQL sẽ sử dụng INDEX FOR GROUP-BY, và nếu bạn có vài màu sắc, truy vấn này sẽ ngay lập tức ngay cả với hàng triệu bản ghi.

    Đây là ví dụ về trường hợp khi chỉ mục trên trường thẻ thấp nhất là nhiều hơn hiệu quả hơn trường trên một trường cardinality cao.

Lưu ý rằng nếu hiệu suất DML không có nhiều vấn đề, thì sẽ an toàn khi tạo chỉ mục.

Nếu trình tối ưu hóa cho rằng chỉ mục không hiệu quả, chỉ mục sẽ không được sử dụng.

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