Tôi có cần thêm chỉ mục một cột mới vào bảng nếu chỉ mục nhiều cột trên trường đó đã tồn tại không?


10

Tôi có một bảng có UNIQUEchỉ mục nhiều cột trên _job_id____keyword_id__.

Tôi cũng cần thêm một chỉ mục khác __job_id__nếu tôi có một truy vấn thường xuyên thực hiện một GROUP BYtrên cột đó?

(ở 100 triệu hàng có thể mất một lúc. Đây là lý do tại sao tôi hỏi thay vì chỉ làm)


Nếu câu hỏi thực sự của bạn là về một truy vấn chậm, thì vui lòng cung cấp SHOW CREATE TABLE SHOW TABLE STATUS SHOW VARIABLES THÍCH '% buffer%' EXPLAIN CHỌN ... Có bao nhiêu RAM? Có nhiều lý do có thể; hầu hết có thể được phát hiện bằng cách xem qua các mục đó.
Rick James

Câu trả lời:


5

Không hoàn toàn không !!! Trình tối ưu hóa truy vấn MySQL sẽ thực hiện đúng nếu cột chính cần thiết nằm ngoài cùng trong chỉ mục. Nếu bạn đã tạo một chỉ mục như vậy, Trình tối ưu hóa truy vấn MySQL có thể chọn không bao giờ sử dụng chỉ mục đó nếu bạn luôn thực hiện GROUP BY job_id, keyword_id. Trình tối ưu hóa truy vấn MySQL có thể hoặc không thể sử dụng chỉ mục nếu bạn chỉ thu thập các bản ghi theo job_id, nhưng sau đó bạn vẫn có một chỉ mục dư thừa lãng phí không gian.

Nếu bảng là MyISAM, việc tạo một chỉ mục như vậy sẽ chỉ làm nở tệp MYI.

Nếu bảng là InnoDB và innodb_file_per_table là 0, việc tạo một chỉ mục như vậy sẽ chỉ phình to ibdata1.

Nếu bảng là InnoDB và innodb_file_per_table là 1, thì việc tạo một chỉ mục như vậy sẽ chỉ làm nở tệp .ibd của bảng.

Tóm lại, bạn không cần phải tạo chỉ mục bổ sung đó !!!


Bạn có chắc không? Anh chàng này gợi ý khác: stackoverflow.com/questions/179085/ , hay điều này khác với MySQL với MSSQL?
Tadej

4

Các chỉ mục chỉ có thể tăng tốc các group byhoạt động bằng cách giảm sắp xếp - điều này sẽ hiệu quả hơn nếu chỉ mục được sử dụng là chỉ mục được nhóm hoặc ít nhất có cùng cột dẫn với chỉ mục được phân cụm. Trong tất cả điều này, tôi cho rằng MySQL không có hash group byhoạt động tương đương với hoạt động thường sẽ bỏ qua bất kỳ lợi ích nào của các chỉ mục - có lẽ ai đó có thể xác nhận điều này.

Có một lợi ích cận biên khi có một chỉ mục riêng khi job_idgiả sử đó là cột duy nhất trong group bymệnh đề và không phải là chỉ mục được nhóm: chỉ mục sẽ nhỏ hơn và do đó quét nó sẽ tạo ra ít I / O hơn

--BIÊN TẬP--

Vì một chỉ mục chứa tất cả các trường khóa chính được xác định cho khóa chỉ mục được phân cụm không nằm trong chỉ mục phụ , nên một chỉ mục trên job_idsẽ chỉ nhỏ hơn một chỉ mục trên job_id, keyword_idnếu keyword_idkhông phải là một phần của chỉ mục được phân cụm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.