orderby句を使用しているSQLクエリを最適化しようとしています。EXPLAINを使用すると、クエリは常に「usingfilesort」と表示されます。このクエリは、ユーザーによる投稿にタグが付けられているグループディスカッションフォーラムに適用しています。
これが私が使用している3つのテーブルです:users、user_tag、tags
user_tagは、ユーザーとそのタグの関連付けマッピングテーブルです。
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を更新します。これが私に問題を与えているクエリです。クエリは、特定のユーザー名のtag_idと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;
説明の出力は次のとおりです。
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;
その「ファイルソートの使用」を失うために何を変更する必要がありますか