2012-05-31 42 views
1

有表:如何解決「使用filesort」這個SQL?

CREATE TABLE `deal_keyword` (
    `deal_id` int(11) unsigned NOT NULL default '0', 
    `keyword_id` int(11) unsigned NOT NULL default '0', 
    `area_id` int(11) unsigned NOT NULL default '0', 
    PRIMARY KEY (`deal_id`,`keyword_id`), 
    KEY `area_id` (`area_id`,`keyword_id`,`deal_id`) 
) TYPE=MyISAM; 

輸入一些記錄測試:

insert into deal_keyword values(1,2,3); 
insert into deal_keyword values(2,2,3); 
insert into deal_keyword values(3,2,3); 
insert into deal_keyword values(4,1,3); 
insert into deal_keyword values(5,1,3); 
insert into deal_keyword values(6,1,3); 
insert into deal_keyword values(7,3,3); 
insert into deal_keyword values(8,3,3); 

當我運行該SQL:

我該如何解決 「使用文件排序」 爲這個SQL?

感謝您的幫助:)

+1

嘗試在「deal_id」上放置單獨的索引。您在'order by'子句中自己使用它,並且由於它是多字段組合鍵的最後一個成員,所以'area_id'索引不能用於排序查找。 –

+0

你讀過https://dev.mysql.com/doc/refman/5.5/en/order-by-optimization.html嗎? –

+0

@ marc-b謝謝,如果我爲這個SQL創建一個索引,我該怎麼辦? (這是MYISAM表,所以我認爲deal_id上的單個索引沒有幫助) – Koerr

回答

1

創建於(area_id, deal_id, keyword_id)一個綜合指數(按照這個順序)

需要注意的是,如果你在你的表有額外的列,索引掃描不一定比一個文件排序更好ORDER BY沒有LIMIT,因爲遍歷索引需要​​查找表,這意味着隨機查找並且效率不高。

+1

完美!我真的想知道爲什麼'(area_id,deal_id,keyword_id)'不是filesort而是'(area_id,keyword_id,deal_id)'可以,這兩個指標有什麼區別? – Koerr

+1

@Zenoto:第一個在給定的'area_id'內保留'deal_id'的順序,第二個不。 – Quassnoi