MySQL застрял на «использование файловой сортировки» при выполнении «заказа по» - PullRequest
1 голос
/ 20 апреля 2010

Не получается, чтобы мой запрос прекратил использование файловой сортировки.

Это мой запрос:

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

edit: я вырезал некоторые ненужные части из моей структуры запросов / таблицы.

У кого-нибудь есть идеи?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2010

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

В некоторых случаях MySQL не может использовать индексы для разрешения ORDER BY, хотя он все еще использует индексы для поиска строки, которые соответствуют предложению WHERE. Эти случаи включают в себя следующее ... Ключ, используемый для извлечения строк, не является такой же, как тот, который использовался в ЗАКАЗЕ BY

0 голосов
/ 20 апреля 2010

лучшее, что вы можете сделать, это создать индексы:

  1. индекс, который охватывает таблицу ships с полями: game + pilot + sector + hull ( в этом конкретном порядке )
  2. pilots: game + id

этот конкретный запрос всегда будет использовать файловую сортировку, потому что у него нет условия диапазона p.id <> 2

...