0

我正在尝试优化使用 order by 子句的 sql 查询。当我使用 EXPLAIN 时,查询总是显示“使用文件排序”。我将此查询应用于一个小组讨论论坛,其中用户的帖子附加了标签。

这是我正在使用的 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

I'm rather rusty with this, but here goes.

The key used to fetch the rows is not the same as the one used in the ORDER BY:

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

As mentioned by OMG Ponies, an index on user_id, usage_count may resolve the filesort.

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

“使用文件排序”不一定是坏事;在许多情况下,这实际上并不重要。

此外,它的名称有些混乱。filesort() 函数不一定使用临时文件来执行排序。对于小型数据集,数据在内存中排序非常快。

除非您认为这是一个特定问题(例如,在实验室中对生产级硬件上的应用程序进行分析后,删除 ORDER BY 解决了特定的性能问题),或者您的数据集很大,否则您可能不应该担心它。

于 2010-07-12T07:18:34.270 回答