2010-07-12 2 views
0

order by 절을 사용하는 SQL 쿼리를 최적화하려고합니다. EXPLAIN을 사용할 때 쿼리는 항상 "filesort 사용"을 표시합니다. 이 쿼리는 사용자가 게시물에 태그가 첨부 된 그룹 토론 포럼에 적용됩니다. 사용자, user_tag, 태그SQL 쿼리는 항상 by 절을 사용합니다.

user_tag는 사용자와 사용자의 태그 협회 매핑 테이블 : 여기

는 3 개 내가 사용하고있는 테이블이다.

CREATE TABLE `usertable` (
`user_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`user_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, 
PRIMARY KEY (`user_name`), 
KEY `user_id` (`user_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CREATE TABLE `user_tag` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`user_id` int(11) unsigned NOT NULL, 
`tag_id` int(11) unsigned NOT NULL, 
`usage_count` int(11) unsigned NOT NULL, 
PRIMARY KEY (`id`), 
KEY `tag_id` (`tag_id`), 
KEY `usage_count` (`usage_count`), 
KEY `user_id` (`user_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

프로그래밍을 사용하여 서버 측 usage_count를 업데이트합니다. 여기에 문제가되는 질문이 있습니다. 쿼리 순서

여기
select user_tag.tag_id, user_tag.usage_count 
    from user_tag inner join usertable on usertable.user_id = user_tag.user_id 
where user_name="abc" order by usage_count DESC; 

내림차순으로 사용 횟수으로 분류 특정 사용자 이름에 대한 tag_id 및 USAGE_COUNT을 찾기 위해 설명 출력입니다 :

mysql> explain select 
    user_tag.tag_id, 
    user_tag.usage_count from user_tag 
    inner join usertable on 
    user_tag.user_id = usertable.user_id 
    where user_name="abc" order by 
    user_tag.usage_count desc; 

Explain output here

무엇 나는 그것을 잃기 위해 바뀌어야한다 "filesort 사용"

+0

실제로 EXPLAIN의 결과를 표시하지 않습니다. 또한 각 테이블에 대해 SHOW CREATE TABLE에 대한 출력을 제공해야합니다. 그러면 테이블의 색인이 표시됩니다. –

+0

@ George - EXPLAIN의 출력에 대한 링크를 게시했습니다. 또한 색인을 표시하는 질문을 편집했습니다. – vikmalhotra

+1

@OMG 조랑말 나는 모든 경우는 아니지만 대부분의 경우 동의어라고 생각합니다. –

답변

3

나는 이것에 다소 녹슬었지만 여기서 간다. OMG 조랑말, USAGE_COUNT 월 USER_ID에 인덱스 바와 같이

http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html

:

행을 페치하는 데 사용되는 키에 의해 순서에 사용한 것과 동일하지 filesort를 해결하십시오.

KEY `user_id_usage_count` (`user_id`,`usage_count`) 
+0

감사합니다. 나는 시도했다. 그러나 이것은 단지 Explain의 가능한 키 열에 하나 더 많은 키를 추가한다.설명의 추가 열은 그대로 유지됩니다. – vikmalhotra

+0

이 경우 행을 반입하는 데 사용되는 키는 "usertable"테이블에서오고, 오더에 사용 된 키는 테이블 "user_tag"에서 가져옵니다. 그래서 기본적으로 두 필드가있는 키를 만들 수 없습니다. 맞습니까? – vikmalhotra

+0

@OMG 조랑말 - 네 말이 맞을 것 같아. 내 기본 테이블의 기본 필드와 내 연관 매핑 테이블의 외래 키가 동일하지 않기 때문에 문제가 발생합니다. 내 테이블 구조를 약간 조정하여 동일하게 만들 필요가 있습니다. – vikmalhotra

1

"파일 포트 사용"은 반드시 나쁜 것은 아닙니다. 많은 경우에 실제로 중요하지 않습니다.

또한 이름이 다소 혼란 스럽습니다. filesort() 함수는 반드시 임시 파일을 사용하여 정렬을 수행하지 않습니다. 작은 데이터 세트의 경우, 데이터는 매우 빨리 메모리에 정렬됩니다.

특정 문제 (예 : 실험실의 프로덕션 수준 하드웨어에서 응용 프로그램을 프로파일 링 한 후 ORDER BY를 제거하면 특정 성능 문제가 해결됨) 또는 데이터 세트가 크지 않은 경우가 아니면 그것에 대해 걱정하십시오.

관련 문제