我正在尝试优化使用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;
我应该改变什么来失去“使用filesort”
答案 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解决了特定的性能问题),或者您的数据集很大,否则您可能不必担心关于它。