2010-04-20 53 views
1

我似乎無法讓我的查詢停止使用filesort。MySQL在執行「order by」時被卡在「使用filesort」

這是我的查詢:

SELECT s.`pilot`, p.`name`, s.`sector`, s.`hull` 
FROM `pilots` p 
LEFT JOIN `ships` s ON ((s.`game` = p.`game`) 
    AND (s.`pilot` = p.`id`)) 
WHERE p.`game` = 1 
AND p.`id` <> 2 
AND s.`sector` = 43 
AND s.`hull` > 0 
ORDER BY p.`last_move` DESC 

表結構:

CREATE TABLE IF NOT EXISTS `pilots` (
    `id` mediumint(5) unsigned NOT NULL AUTO_INCREMENT, 
    `game` tinyint(3) unsigned NOT NULL DEFAULT '0', 
    `last_move` int(10) NOT NULL DEFAULT '0', 
    UNIQUE KEY `id` (`id`), 
    KEY `last_move` (`last_move`), 
    KEY `game_id_lastmove` (`game`,`id`,`last_move`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ; 

CREATE TABLE IF NOT EXISTS `ships` (
    `id` mediumint(5) unsigned NOT NULL AUTO_INCREMENT, 
    `game` tinyint(3) unsigned NOT NULL DEFAULT '0', 
    `pilot` mediumint(5) unsigned NOT NULL DEFAULT '0', 
    `sector` smallint(5) unsigned NOT NULL DEFAULT '0', 
    `hull` smallint(4) unsigned NOT NULL DEFAULT '50', 
    UNIQUE KEY `id` (`id`), 
    KEY `game` (`game`), 
    KEY `pilot` (`pilot`), 
    KEY `sector` (`sector`), 
    KEY `hull` (`hull`), 
    KEY `game_2` (`game`,`pilot`,`sector`,`hull`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ; 

的解釋:

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  p ref id,game_id_lastmove game_id_lastmove 1 const 7 Using where; Using filesort 
1 SIMPLE  s ref game,pilot,sector... game_2 6 const,fightclub_alpha.p.id,const 1 Using where; Using index 

編輯:我剪了一些不必要的作品出來我的查詢/表結構。

有人有什麼想法嗎?

回答

0

,你能做的最好的事情就是讓指數:

  1. 指數,涵蓋表ships與字段:game + pilot + sector + hull(在這個特定的順序
  2. pilotsgame + id

這個特定的查詢將總是使用filesort,因爲它沒有範圍條件p.id <> 2

+0

感謝您的快速答案之一。不知道NOT會強迫它使用filesort! 當你做出索引時,你的字段的順序是否重要? – noko 2010-04-20 03:17:00

+0

我只是嘗試刪除p.id <> 2,它仍然使用filesort。 : – noko 2010-04-20 03:20:19

+0

刪除條件後應該出現新的索引:pilot:'game + last_move'。ps:<>不強制使用filesort - 它只是避免使用索引的最右部分pps:是的,索引中字段的順序是重要的 – zerkms 2010-04-20 03:22:56