SQL Query始终在order by子句中使用filesort

时间:2010-07-12 01:53:39

标签: sql mysql sql-order-by filesort

我正在尝试优化使用order by子句的sql查询。当我使用EXPLAIN时,查询始终显示“using filesort”。我将此查询应用于小组讨论论坛,其中有用户将帖子附加到帖子上。

以下是我使用的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;

Explain output here

我应该改变什么来失去“使用filesort”

2 个答案:

答案 0 :(得分:3)

我对此非常生疏,但现在就去了。

  

用于获取行的键与ORDER BY中使用的键不同:

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

如OMG Ponies所述,user_id的索引,usage_count可以解析文件分区。

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

答案 1 :(得分:1)

“使用filesort”并不一定是坏事;在许多情况下,它实际上并不重要。

此外,它的名字有点令人困惑。 filesort()函数不一定使用临时文件来执行排序。对于小数据集,数据在内存中排序非常快。

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