2010-07-12 26 views
0

我想優化一個使用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; 

Explain output here

什麼我應該改變失去,「使用filesort」

+0

您實際上並未顯示EXPLAIN的輸出。您應該也可以爲每個表的SHOW CREATE TABLE提供輸出。這將顯示錶上的索引。 – 2010-07-12 01:56:14

+0

@George - 我發佈了鏈接到EXPLAIN的輸出。還編輯了問題以顯示索引。 – vikmalhotra 2010-07-12 02:22:30

+1

@OMG小馬我認爲它們在大多數情況下都是同義詞,即使不是全部情況。 – 2010-07-12 02:44:33

回答

3

我對此很生疏,但在這裏 去。

用於提取的行的關鍵是不一樣在ORDER使用的一個:

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

如由OMG小馬,上USER_ID,usage_count可以索引提到解決文件。

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

感謝您的支持。我試過了,但這只是在Explain的可能的鍵列中增加了一個鍵。解釋額外列保持不變。 – vikmalhotra 2010-07-12 03:38:27

+0

在這種情況下用於提取行的鍵是來自表「usertable」,而用於排序的鍵來自表「user_tag」。所以,基本上我不能創建一個同時具有這兩個字段的密鑰,對吧? – vikmalhotra 2010-07-12 03:40:31

+0

@OMG小馬 - 我想你是對的。由於我的主表中的主字段和我的關聯映射表中的外鍵不一樣,這就是爲什麼我有問題。我需要稍微調整一下我的表格結構以使它們相同。 – vikmalhotra 2010-07-12 03:44:48

1

「使用filesort」不一定是壞的;在很多情況下,這並不重要。

此外,它的名字有點混淆。 filesort()函數不一定使用臨時文件來執行排序。對於小數據集,數據在內存中排序非常快。

除非您認爲這是一個特定的問題(例如,在實驗室中在生產級硬件上分析您的應用程序後,刪除ORDER BY將解決特定的性能問題),否則您的數據集可能不大擔心它。