2010-11-28 10 views
0

태그로 일부 항목을 필터링하는 매우 일반적인 기능을 구현하고 싶습니다. 그것을하는 방법의 예제와 인터넷에 많은 자습서가 있습니다. 쿼리는 매우 간단하고 빠릅니다 (적절한 인덱스가 있다고 가정).
일반적으로 필터링 된 항목은 일부 필드별로 정렬해야합니다. 예를 들어 SO라는 태그로 질문을 필터링하면 검색 결과가 정렬됩니다. 태그로 필터링 된 항목 정렬

이 작업 (우리가 등급을 기준으로 정렬 할 필요가 가정)을 달성하기 위해, 하나는 쓸 수 :

SELECT item.id FROM item 
    INNER JOIN taggeditem ON taggeditem.item_id = item.id 
WHERE 
    taggeditem.tag_id = 1234 
ORDER BY item.rating DESC 

을 우리는 인덱스 (taggeditem.tag_id), (item.id), (item.rating)가 이 쿼리에 대한 문제는 MySQL은 할 수없는 것입니다 행을 가져 오는 데 사용 된 키가 ORDER BY (MySQL: ORDER BY Optimization)에서 사용 된 키와 같지 않기 때문에 item.rating에 인덱스를 사용하십시오. 임시 테이블과 파일 세트를 사용하게되면 실행 시간이 느려집니다.

내가 해결할 해결책은 taggeditem 테이블에 대한 정렬 필드를 비정규 화하여 테이블 (tag_id, item_rating)taggeditem에 만들 수 있도록하는 것입니다.

나는 SO에서 유사한 질문을 검색했으며이 중 하나만 찾았습니다 : Mysql slow query: INNER JOIN + ORDER BY causes filesort. 해결책은 동일했습니다.

그래서이 질문에 대한 일반적인 해결책이 있습니까? 많은 종류의 정렬 필드를 생성, 등급 등의 taggeditem으로 비정규 화하는 것이 좋습니다. 그래서 네 가지 매개 변수 (최신, 인기 투표, 활성)를 사용하여 정렬 할 수 있습니다 - 결과를 정렬하는 데 사용되는 필드를 비정규화한 것을 의미합니까? 이 솔루션에 대한 대안이 있습니까?

+0

은 항목 또는 항목입니까? 혼동 ... SQL – ajreal

+0

을 다시 확인하고 싶습니다. 물론 테이블 항목을 의미했습니다. –

답변

1

표준 대체 - 서버 시스템 변수 변경이 있습니다. 예를 들어, sort_buffer_size 값 (기본값 2MB)으로 실험 할 수 있습니다. More입니다.

+0

문제는 filesort뿐 아니라 임시 테이블을 만드는 데 있습니다. 대부분 임시 테이블에 복사하는 데 소비합니다. 그걸로 뭐라도 할 수 있을까요? –

+0

미안하지만 아니야. MySQL의 제한 사항입니다. – Lex

0

JOIN을 사용하고 조인 된 테이블을 필터링하는 즉시 성능이 저하됩니다.

당신이 말했듯이, 이것을 피하는 유일한 방법은 비정규 화 된 테이블을 만드는 것입니다. SO의 종류에 대한

, 나는 그들이 그러한 문제가 없다고 생각 : 그들은 단지 나는 또한 찾고 있어요 답변 '테이블의 열을 기준으로 ( question_id, answer_date에 인덱스 SELECT * FROM answers WHERE question_id = 1234 SORT BY answer_date 같은)

답변을 정렬 할 수 있습니다 다중 값 열이있는 그러한 솔루션의 경우 매우 복잡합니다 (비표준 데이터는 여러 값을 갖는 열의 모든 값을 교차해야하기 때문에 엄청납니다)

+0

그런 문제가 있습니다. 태그별로 필터링하면 가장 새로운 질문이 먼저 표시됩니다 (또는 가장 중요하지 않음). –