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;
무엇 나는 그것을 잃기 위해 바뀌어야한다 "filesort 사용"
실제로 EXPLAIN의 결과를 표시하지 않습니다. 또한 각 테이블에 대해 SHOW CREATE TABLE에 대한 출력을 제공해야합니다. 그러면 테이블의 색인이 표시됩니다. –
@ George - EXPLAIN의 출력에 대한 링크를 게시했습니다. 또한 색인을 표시하는 질문을 편집했습니다. – vikmalhotra
@OMG 조랑말 나는 모든 경우는 아니지만 대부분의 경우 동의어라고 생각합니다. –