태그로 일부 항목을 필터링하는 매우 일반적인 기능을 구현하고 싶습니다. 그것을하는 방법의 예제와 인터넷에 많은 자습서가 있습니다. 쿼리는 매우 간단하고 빠릅니다 (적절한 인덱스가 있다고 가정).
일반적으로 필터링 된 항목은 일부 필드별로 정렬해야합니다. 예를 들어 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으로 비정규 화하는 것이 좋습니다. 그래서 네 가지 매개 변수 (최신, 인기 투표, 활성)를 사용하여 정렬 할 수 있습니다 - 결과를 정렬하는 데 사용되는 필드를 비정규화한 것을 의미합니까? 이 솔루션에 대한 대안이 있습니까?
은 항목 또는 항목입니까? 혼동 ... SQL – ajreal
을 다시 확인하고 싶습니다. 물론 테이블 항목을 의미했습니다. –