Любой способ избежать fileort, когда порядок отличается от where where?

У меня невероятно простой запрос (тип таблицы InnoDb) и EXPLAIN говорит, что MySQL должен выполнить дополнительный проход, чтобы узнать, как получить строки в отсортированном порядке.

SELECT * FROM `comments` 
WHERE (commentable_id = 1976) 
ORDER BY created_at desc LIMIT 0, 5

вывод точного объяснения:

table   select_type     type    extra                          possible_keys   key             key length   ref     rows
comments   simple      ref   using where; using filesort    common_lookups  common_lookups  5   const   89

commentable_id индексируется. В комментариях нет ничего трюка, просто в области содержимого.

В пособии указано, что если порядок отличается от того, где нет, то файлопорта можно избежать.

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

Я также пробовал заказ по id, а также его эквивалент, но не имеет значения, даже если я добавляю id в качестве индекса (который, как я понимаю, не требуется, поскольку id индексируется неявно в MySQL).

заблаговременно за любые идеи!

Отметить - здесь SHOW CREATE TABLE

CREATE TABLE `comments` (
  `id` int(11) NOT NULL auto_increment,
  `user_id` int(11) default NULL,
  `commentable_type` varchar(255) default NULL,
  `commentable_id` int(11) default NULL,
  `content` text,
  `created_at` datetime default NULL,
  `updated_at` datetime default NULL,
  `hidden` tinyint(1) default '0',
  `public` tinyint(1) default '1',
  `access_point` int(11) default '0',
  `item_id` int(11) default NULL,
  PRIMARY KEY  (`id`),
  KEY `created_at` (`created_at`),
  KEY `common_lookups` (`commentable_id`,`commentable_type`,`hidden`,`created_at`,`public`),
  KEY `index_comments_on_item_id` (`item_id`),
  KEY `index_comments_on_item_id_and_created_at` (`item_id`,`created_at`),
  KEY `index_comments_on_user_id` (`user_id`),
  KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=31803 DEFAULT CHARSET=latin1

Ответ 1

Обратите внимание, что файловый сервер MySQL не обязательно означает, что он записывает на диск. Это просто означает, что он будет сортироваться без использования индекса. Если набор результатов достаточно мал, MySQL будет сортировать его в памяти, что на порядок быстрее, чем дисковый ввод-вывод.

Вы можете увеличить объем памяти, который MySQL выделяет для файловых массивов в памяти, используя переменную сервера sort_buffer_size. В MySQL 5.1 размер буфера сортировки по умолчанию составляет 2 МБ, а максимум, который вы можете выделить, - 4 ГБ.


update: Что касается комментария Джонатана Леффлера относительно измерения продолжительности сортировки, вы можете узнать, как использовать SHOW PROFILE FOR QUERY, который даст вам информацию о том, как долго выполняется каждая фаза выполнения запроса.

Ответ 2

Попробуйте добавить объединенный индекс в (commentable_id, created_at).