2012-09-02 7 views
5

파일과 범주 간의 연결을 나타내는 다음 표 (file_category_tbl)가 있습니다.다음을 올바르게 색인화하는 방법은 무엇입니까?

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

을 : 범주에서 파일을 정렬 할 수 있도록, 내가 주문 필드가

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

은 ... 그러므로 내 질문에 내가 다음에 최적의 성능에 필요한 것이 무엇 인덱스입니다 유니크 (unique) 인덱스가 있습니다 (fileId, categoryId); 같은 fileId과 동일한 categoryId을 사용할 수 없습니다. categoryId에 대한 색인도 있습니다. 검색중인 내용입니다. 나는 또한 order에 색인을 가지고 있습니까? ... 그러나 이것은 꼭 필요한 것입니까? 그것은 단지 내 이해에 따르면이에 orderBy ... 어떤 응답을

친절 감사 ... J

+0

위의 쿼리에 대해 'categoryId, order'의 다중 인덱스로 충분하다고 생각합니다. – Ankur

+0

mysql이'ORDER BY '부분의 인덱스를 신경 쓰지 않았다고 생각했습니다. 편집 : mysql 수 있습니다 또는 색인을 사용하여 ORDER BY 많은에 따라 달라집니다 : http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html – Krycke

답변

1

을하는 한, 당신의 색인은 합리적이고 쿼리의 성능으로 도움이 될 것입니다. 그러나 나는 또한에만 결합 Unique Index

나는 당신이이 테이블의 레코드의 참조 할 경우이있다 말하고 그 이유를 가진보다는 테이블에서 Primary Key 인덱스가 당신을 건의 할 것, 할 수있다 삭제하거나 다른 기능을 수행하려면 기본 키가 유용합니다. 반면에 모든 필드가 필요하므로 기본 키 필드로 4 개의 필드를 가져와야하기 때문에 쿼리 성능을 실제로 다운 그레이드 할 수 있습니다. 이를 해결하기 위해 결과에 원하는 열을 지정할 수 있습니다. ORDER BY Optimization 아래의 문서로

희망이

2

:-) 의미가 있습니다 : 여전히 찾을 인덱스를 사용하지만, 어떤 경우에는

, MySQL은 사용 인덱스는 ORDER BY를 해결하기 위해 수 없습니다 WHERE 절과 일치하는 행

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

[ deletia ]

  • 행을 인출하는 데 사용되는 키가 ORDER BY에 사용 된 것과 동일하지 않습니다 :이 경우는 다음과 같습니다

    따라서 현재 인덱싱을 사용하여 정렬 작업을 수행 할 수 없습니다 엔.그러나, 같은 페이지도 문서 :

    ORDER BY 정확히 인덱스 일치하지 않는 경우 인덱스 또한,도 사용할 수 있습니다 한 인덱스의 사용되지 않는 부분과 모든 여분의 ORDER BY의 모든 등 열은 WHERE 절의 상수입니다. 다음 쿼리는 ORDER BY 부분을 해결하기 위해 인덱스를 사용

    [ deletia ]

    따라서 (categoryId,order) 이상의 복합 인덱스가 모두 필터 정렬 작업에 사용 할 수 있습니다
    SELECT * FROM t1 
        WHERE key_part1=constant 
        ORDER BY key_part2;

    , 이는이 쿼리에 대한 최적의 결과입니다.

관련 문제