0

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;

ここで出力を説明する

その「ファイルソートの使用」を失うために何を変更する必要がありますか

4

2 に答える 2

3

私はこれでかなり錆びていますが、ここに行きます。

行のフェッチに使用されるキーは、ORDERBYで使用されるキーと同じではありません。

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

ユーザーIDのインデックスであるOMGPoniesが述べているように、usage_countはファイルソートを解決する場合があります。

KEY `user_id_usage_count` (`user_id`,`usage_count`)
于 2010-07-12T03:14:35.017 に答える
1

「filesortの使用」は必ずしも悪いことではありません。多くの場合、それは実際には問題ではありません。

また、その名前はやや紛らわしいです。filesort()関数は、ソートを実行するために必ずしも一時ファイルを使用するわけではありません。小さなデータセットの場合、データはメモリ内でソートされます。これは非常に高速です。

特定の問題であると思われる場合(たとえば、ラボで本番環境グレードのハードウェアでアプリケーションをプロファイリングした後、ORDER BYを削除すると特定のパフォーマンスの問題が解決される場合)、またはデータセットが大きい場合を除いて、おそらく心配する必要はありません。

于 2010-07-12T07:18:34.270 に答える