2012-09-02 28 views
5

Tôi có bảng sau đây (file_category_tbl) để thể hiện các kết nối giữa các tệp và danh mục.Làm cách nào để lập chỉ mục chính xác các mục sau?

fileId - bigint(20)   
categoryId - bigint(20) 
order - int(10) 

Vì vậy mà các tập tin trong danh mục có thể được đặt hàng, tôi có một lĩnh vực trật tự ... Vì vậy câu hỏi của tôi là những gì chỉ tôi sẽ yêu cầu cho hiệu suất tối ưu trên như sau:

SELECT * FROM file_category_tbl WHERE categoryId="3" ORDER BY order ASC 

Tôi có một chỉ số duy nhất là UNIQUE (fileId, categoryId); Vì không thể giống nhau fileId với cùng một categoryId. Tôi cũng có chỉ mục trên categoryId, vì đây là những gì đang được tìm kiếm. Tôi cũng có chỉ mục trên order? ... nhưng điều này có cần thiết không? vì nó chỉ được làm một orderBy về vấn đề này ...

Kind Regards cho bất kỳ trả lời ... J

+0

tôi nghĩ một chỉ mục đa trên 'categoryId, order' phải đủ cho truy vấn trên – Ankur

+0

Tôi nghĩ rằng mysql không quan tâm đến các chỉ mục trong phần' ORDER BY'. EDIT: Nếu mysql có thể hoặc không thể sử dụng các chỉ mục trên 'ORDER BY' phụ thuộc vào rất nhiều: http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html – Krycke

Trả lời

1

Theo hiểu biết của tôi, lập chỉ mục của bạn là hợp lý và sẽ giúp đối với hiệu suất truy vấn của bạn. Nhưng tôi cũng khuyên bạn nên có chỉ mục Primary Key trong bảng của bạn thay vì chỉ có kết hợp Unique Index

Lý do tôi nói đây là, Nếu bạn muốn tham chiếu đến bất kỳ bản ghi nào của bảng này, có thể là để xóa nó hoặc thực hiện bất kỳ chức năng nào khác, khóa chính sẽ hữu ích. Mặt khác, nó thực sự có thể hạ cấp hiệu suất truy vấn của bạn bởi vì bạn đang yêu cầu tất cả các trường và bây giờ với trường khóa chính, bạn phải đưa vào 4 trường. Như một giải pháp cho điều đó, bạn có thể chỉ định những cột nào bạn muốn trong kết quả của mình.

Hy vọng điều này có ý nghĩa :-)

2

Như ghi nhận dưới ORDER BY Optimization:

Trong một số trường hợp, MySQL không thể chỉ số sử dụng để giải quyết ORDER BY, mặc dù nó vẫn sử dụng chỉ số để tìm các hàng khớp với mệnh đề WHERE. Những trường hợp này bao gồm:

[ deletia ]

  • Chìa khóa dùng để lấy hàng là không giống như một trong những sử dụng trong ORDER BY:

    SELECT * FROM t1 WHERE key2=constant ORDER BY key1;

Do đó, việc lập chỉ mục hiện tại của bạn không thể được sử dụng để thực hiện thao tác sắp xếp n.Tuy nhiên, cùng một trang cũng tài liệu:

Chỉ số cũng có thể được sử dụng ngay cả khi ORDER BY không phù hợp với các chỉ số chính xác, miễn là tất cả các phần chưa sử dụng của chỉ mục và tất cả các phụ ORDER BY Các cột là các hằng số trong mệnh đề WHERE. Các truy vấn sau đây sử dụng các chỉ số để giải quyết ORDER BY phần:

[ deletia ]

SELECT * FROM t1 
    WHERE key_part1=constant 
    ORDER BY key_part2;

Do đó một số hợp chất trên (categoryId,order) có thể được sử dụng cho cả bộ lọc các hoạt động sắp xếp, đó là kết quả tối ưu cho truy vấn này.

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