我想優化一個使用order by子句的sql查詢。當我使用EXPLAIN時,查詢總是顯示「using filesort」。我正在將此查詢應用於有論壇附有標籤的小組討論論壇。SQL查詢總是按順序使用filesort
這裏有3個表,我使用:用戶,user_tag,標籤
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」
您實際上並未顯示EXPLAIN的輸出。您應該也可以爲每個表的SHOW CREATE TABLE提供輸出。這將顯示錶上的索引。 – 2010-07-12 01:56:14
@George - 我發佈了鏈接到EXPLAIN的輸出。還編輯了問題以顯示索引。 – vikmalhotra 2010-07-12 02:22:30
@OMG小馬我認爲它們在大多數情況下都是同義詞,即使不是全部情況。 – 2010-07-12 02:44:33