【发布时间】:2010-07-12 01:53:39
【问题描述】:
我正在尝试优化使用 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;
我应该改变什么来失去“使用文件排序”
【问题讨论】:
-
您实际上并没有显示 EXPLAIN 的输出。您可能还应该为每个表提供 SHOW CREATE TABLE 的输出。这将显示表上的索引。
-
@George - 我已经发布了 EXPLAIN 输出的链接。还编辑了问题以显示索引。
-
@OMG Ponies 我相信它们在大多数情况下都是同义词,如果不是全部的话。
-
@OMG Ponies - 当我输入
show indexes from user_tag时,它会显示所有键 - usage_count、tag_id、user_id -
@George Marian:谢谢@ShiVik:这意味着它们是单独的索引 - 覆盖索引涉及多个列:mysqlperformanceblog.com/2006/11/23/…
标签: sql mysql sql-order-by filesort